1 Introduction

The code and information contained herein constitutes the complete write-up of the experiments I carried out for my first Qualifying Paper towards the PhD in Linguistics at Stanford University. The goal is to make this document both a dumping ground for my ideas while it is in progress, as well as, eventually, a publicly-available version of my Qualifying Paper, in the spirit of Open Science.

1.1 Preliminaries

1.1.1 Setting up the Notebook

For this write-up and analysis, I require the following packages, loaded in here:

library(ggplot2) 
library(tidyverse) 
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✓ tibble  3.1.2     ✓ dplyr   1.0.6
✓ tidyr   1.1.3     ✓ stringr 1.4.0
✓ readr   1.4.0     ✓ forcats 0.5.1
✓ purrr   0.3.4     
── Conflicts ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x tidyr::expand() masks Matrix::expand()
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
x tidyr::pack()   masks Matrix::pack()
x tidyr::unpack() masks Matrix::unpack()
library(lme4) 
library(stringr)
library(languageR)
library(lmerTest)
library(reshape2)

Attaching package: ‘reshape2’

The following object is masked from ‘package:tidyr’:

    smiths
library(grid)

source("helpers.R")

I also use a custom color palette, so I include the code for that here as well1.

bran_palette = c("#7ae7e5", "#fe5f55", "#B2A6DE", "#14342b", "#69385c")

theme_set(theme_minimal())

1.1.2 Frequency Data

We also need the frequency data!

frequency <- read.csv("freq_vals.csv")
lib_cols <- c('ABC','CNN','PBS','NBC','MSNBC','NPR','CBS')
frequency <- frequency %>%
  mutate(total_left = rowSums(frequency[lib_cols])) %>%
  mutate(total_right = FOX) %>%
  mutate(all_wpm = ((total_left + total_right) / 121500000) * 1000000) %>%
  mutate(left_wpm = (total_left/109300000) * 1000000) %>%
  mutate(right_wpm = (total_right/12200000) * 1000000) %>%
  mutate(neutral_binary = ifelse(gender=="neutral",1,0)) %>%
  mutate(morph_type = ifelse(lexeme!= 'actor' & lexeme!= 'host' & lexeme !='hunter' & lexeme!= 'villain' & lexeme!= 'heir' & lexeme!= 'hero','compound','adoption')) 
frequency <- frequency %>%
  group_by(word) %>%
  summarise(mean_freq_left = mean(left_wpm), mean_freq_right = mean(right_wpm), mean_freq_all = mean(all_wpm)) %>%
  rename(form = word)

Re-write frequency to avoid zero numbers!

frequency[frequency == 0.00000000] <- 0.0001

Take log frequency of each media type.

frequency <- frequency %>%
  mutate(log_right = log(mean_freq_right), log_left = log(mean_freq_left), log_all = log(mean_freq_all)) 

Create media difference

frequency <- frequency %>% 
  mutate(media_diff = log_left - log_right) %>%
  mutate(nonexistent = ifelse(media_diff == 0 & log_left < -4,"true","false"))

1.1.3 Norming Data

And here is the norming data values:

norming_data <- read.csv("norming_data.csv") %>%
  filter(id!="example1") %>% # Will filter out non-critical trials, i.e. the example trial from the beginning of the experiment
  mutate(equalized_response = ifelse(scale=="FM",8-response,response)) %>% # This will render all data points on the same scale, as participants randomly received either "very likely a man" or "very likely a woman" as the left end of their response scale, with the other appearing at the right end
  mutate(orthog = ifelse(orthog=="sroceress","sorceress",orthog)) %>% # Fixes a typo
  mutate(id = ifelse(id=="Stunt_double","stunt double",id)) %>% # This, as well as all lines below it, convert compounds formed by spaces from their underscore forms to their spaced forms (e.g. police_officer -> Police officer)
  mutate(id = ifelse(id=="Police_officer","police officer",id)) %>%
  mutate(id = ifelse(id=="Flight_attendant","flight attendant",id)) %>%
  mutate(id = ifelse(id=="Anchor","anchor",id)) %>%
  mutate(id = ifelse(id=="Businessperson","businessperson",id)) %>%
   mutate(id = ifelse(id=="Camera","camera operator",id)) %>%
  mutate(id = ifelse(id=="Congressperson","congressperson",id)) %>%
  mutate(id = ifelse(id=="Craftsperson","craftsperson",id)) %>%
  mutate(id = ifelse(id=="Crewmember","crewmember",id)) %>%
  mutate(id = ifelse(id=="Firefighter","firefighter",id)) %>%
  mutate(id = ifelse(id=="Foreperson","foreperson",id)) %>%
  mutate(id = ifelse(id=="Layperson","layperson",id)) %>%
  mutate(id = ifelse(id=="Meteorologist","meteorologist",id)) %>%
  mutate(id = ifelse(id=="Salesperson","salesperson",id)) %>%
  mutate(id = ifelse(id=="Actor","actor",id)) %>%
  mutate(id = ifelse(id=="Heir","heir",id)) %>%
  mutate(id = ifelse(id=="Hero","hero",id)) %>%
  mutate(id = ifelse(id=="Host","host",id)) %>%
  mutate(id = ifelse(id=="Hunter","hunter",id)) %>%
  mutate(id = ifelse(id=="Villain","villain",id)) %>%
  mutate(orthog = ifelse(orthog=="airline steward","steward",orthog)) %>%
  mutate(orthog = ifelse(orthog=="airline stewardess","stewardess",orthog))
norming_exclusion <- norming_data %>% 
  filter(gender=="female") %>% 
  group_by(workerid) %>%
  summarize(female_mean = mean(equalized_response)) %>%
  unique() %>% 
  mutate(exclusion = female_mean < mean(female_mean) - 2*sd(female_mean)) %>%
  filter(exclusion==TRUE)
norming_data <- norming_data[!(norming_data$workerid %in% norming_exclusion$workerid),]
norming_means <- norming_data %>%
  filter(neutral_morh !="male_adoption") %>%
  group_by(orthog,id) %>%
  summarise(indi_mean = mean(equalized_response), trial_count=n()) %>%
  rename(form = orthog) %>%
  rename(lexeme =id)
`summarise()` has grouped output by 'orthog'. You can override using the `.groups` argument.
norming_adoptions <- norming_data %>%
  filter(neutral_morh == "male_adoption") %>%
  group_by(orthog) %>%
  summarise(indi_mean = mean(equalized_response), trial_count=n()) %>%
  mutate(lexeme = ifelse(orthog=="actress","actor",ifelse(orthog=="heiress","heir",ifelse(orthog=="heroine","hero",ifelse(orthog=="hostess","host",ifelse(orthog=="huntress","hunter",ifelse(orthog=="villainess","villain",orthog))))))) %>%
    rename(form = orthog)
norming_adoptions <- norming_adoptions[, c("lexeme", "form", "indi_mean", "trial_count")]
norming_means <- rbind(norming_means,norming_adoptions) %>%
  rename(lexeme_norm = lexeme)

Neutrals Only

norming_means_neutral <- norming_data %>%
  filter(gender=="neutral") %>%
  filter(neutral_morh !="male_adoption") %>%
  group_by(orthog,id) %>%
  summarise(indi_mean = mean(equalized_response), trial_count=n()) %>%
  rename(form = orthog) %>%
  rename(lexeme =id)
`summarise()` has grouped output by 'orthog'. You can override using the `.groups` argument.
norming_adoptions_neutral <- norming_data %>%
  filter(gender=="neutral") %>%
  filter(neutral_morh == "male_adoption") %>%
  group_by(orthog) %>%
  summarise(indi_mean = mean(equalized_response), trial_count=n()) %>%
  mutate(lexeme = ifelse(orthog=="actress","actor",ifelse(orthog=="heiress","heir",ifelse(orthog=="heroine","hero",ifelse(orthog=="hostess","host",ifelse(orthog=="huntress","hunter",ifelse(orthog=="villainess","villain",orthog))))))) %>%
    rename(form = orthog)
norming_adoptions_neutral <- norming_adoptions_neutral[, c("lexeme", "form", "indi_mean", "trial_count")]
norming_means_neutral <- rbind(norming_means_neutral,norming_adoptions_neutral)

1.2 Self-Paced Reading Study

1.2.1 Methods

Participants

We originally ran the experiment on 200 participants, recruited through the online participant recruitment platform Prolific. The mean time of the experiment was 5.39 minutes, and participants were paid $1.75 for their participation2. The only restrictions placed on participants were that they:

  1. Were born in the United States
  2. Lived in the United States at the time of participation
  3. Spoke English as a first language
  4. Had not participated in the norming study for the stimuli

These requirements were implemented in order to assure that speakers came from at least somewhat similar linguistic backgrounds, as certain lexical items in the study (such as congressperson) are quite localized to the United States.

After this initial run of the experiment, we found that there was a dearth of conservative or Republican-aligned participants. As a result, we ran the experiment again, this time on 98 self-identified Republicans. This was achieved by adding a filter on Prolific so that only Republican-identified individuals could see the task. The rest of the experiment, including payment, was exactly the same, except that an additional disclaimer that participants could not use the FireFox browser experiment, after the first run revealed an incompatibility between JavaScript and FireFox. The two runs of the experiment amounted in a total of 298 participants who completed the task.

1.2.2 Analysis

Reading in the Data

sprt_data <- read.csv('sprt_data.csv') %>%
  filter(trial_id!= 'example') %>%
  filter(region=='critical')

Exclusions

Now, we want to exclude any participants who failed to answer at least 85% of the attention check questions correctly. We do this by creating a list of all participants who scored less than 85% on these checks, and then cross-referencing this list with all data points, removing any data points whose participants were in the exclusion list.

sprt_exclusion <- sprt_data %>% group_by(workerid) %>%
  summarise(accuracy = mean(response_correct)) %>%
  mutate(exclude = ifelse(accuracy < 0.85,'Yes','No')) %>% 
  filter(exclude == 'Yes')

sprt_data <- sprt_data[!(sprt_data$workerid %in% sprt_exclusion$workerid),]

We all want to filter out all trials in which the reading time for the critical item was more than 2.5 standard deviations from the mean reading time on that lexical item across all participants.

sprt_data <- sprt_data %>%
  group_by(trial_id) %>%
  mutate(id_mean = mean(log(rt))) %>%
  mutate(exclusion = (log(rt) < mean(log(rt)) - 2*sd(log(rt))|(log(rt) > mean(log(rt)) + 2*sd(log(rt))))) %>%
  ungroup() %>%
  filter(exclusion==FALSE)
spr_data %>% spr_data %>%
  filter(!is.na(subject_information.age)) %>%
  filter(!is.na(subject_information.poli_party))
Error in spr_data(.) : could not find function "spr_data"

This results in 238 trials being removed from the 5580 we got after the by-participant exclusions. We now have 5342 trials we can use for analysis.

Additional Information Now that we have only the rows we want, let’s add some new columns, which will contain important information for each data point. Here, we will be adding:

  • Gender Ideology Subscores
  • Trial Genders
  • Trial Morphology Types
  • Critical Item Length & Length-Controlled Residuals
  • Trial Congruency
  • Partipant Political Affiliation

Ideally, I would’ve added all of these but the first when I actually created the stimuli and logged responses, but I forgot to! Luckily, R allows us to do this post-hoc fairly straightforwardly… which is good, since these features will be critical in our data visualization and analysis.


The question under investigation here is whether or not individuals’ conceptions of gender affect how they process gendered and gender-neutral forms of English personal and professional titles.

In order to examine this, we need to quanify participants’ ideological views! Here we have adopted the 13-item Social Roles Questionnaire put forth in Baber & Tucker (2006). Questions 1-5 correlate to the ‘Gender Transcendent’ subscale, and questions 6-13 correspond to the ‘Gender Linked’ subscale. Each item is scored on a scale of 0-100. So, the first thing we want to do is make two lists of columns which correspond to these two subscales, since the questions are stored individually in the data:

gender_transcendence_cols <- c('subject_information.gender_q1','subject_information.gender_q2','subject_information.gender_q3','subject_information.gender_q4','subject_information.gender_q5')

gender_linked_cols <- c('subject_information.gender_q6','subject_information.gender_q7','subject_information.gender_q8','subject_information.gender_q9','subject_information.gender_q10','subject_information.gender_q11','subject_information.gender_q12','subject_information.gender_q13')


Now we can use the mutate() method on sprt_data to add two new columns, one for each subscale. We tell R to take the means of the specified columns in [column_names] of sprt_data for each individual row: rowMeans(sprt_data[column_names]). We also have to subtract this mean from 100 in the case of the ‘Gender Transcendent’ subscale, since it is inversely scored. Finally, we can create an average total score regardless of subscores, simply by meaning the two subscores we already have.

sprt_data <- sprt_data %>%
  mutate(gender_trans = 100 - (rowMeans(sprt_data[gender_transcendence_cols]))) %>%
  mutate(gender_link = rowMeans(sprt_data[gender_linked_cols])) 

gender_all = c('gender_trans','gender_link')

sprt_data <- sprt_data %>%
  mutate(gender_total = rowMeans(sprt_data[gender_all]))


We also want to add whether the trial included a female or male referent (but also, like, destroy the binary!). In order to do this, we’ll just add a trial_gender column that says ‘female’ if the condition was either ‘neutral_female’ or ‘congruent_female’. Otherwise, we want the trial_gender to say ‘male’.

sprt_data <- sprt_data %>%
  mutate(trial_gender = ifelse(condition=='neutral_female' | condition == 'congruent_female','female','male')) 

sprt_data %>%
  select(workerid,rt,condition,trial_id,trial_gender)


Now we want to add whether or not the lexeme’s neutral form is developed by compounding (as in ‘congress-person’) or by the adoption of the male form (as in ‘actor’ being used more for both men and women). In this study, we only have six lexemes of the latter type, so we’ll just tell R to assign those a morph_type value of ‘adoption’ (for ‘male adoption’), and all else will be assigned a value of ‘compound’.

sprt_data <- sprt_data%>%
  mutate(morph_type = ifelse(lexeme!= 'actor' & lexeme!= 'host' & lexeme !='hunter' & lexeme!= 'villain' & lexeme!= 'heir' & lexeme!= 'hero','compound','adoption'))

sprt_data %>%
  select(rt,lexeme,morph_type)


Another important factor we want to explore is the length of the critical item! In order to add this, we simply create a new column form_length and tell R to input as that column’s value the length of the string that appears in that row’s form column, which corresponds to the orthograpic form of the critical item in that trial. Note that this will include spaces in the count!

sprt_data <- sprt_data %>%
  mutate(form_length = str_length(form))

sprt_residual_model <- lm(log(rt)~form_length, data = sprt_data)

sprt_data <- sprt_data %>%
  mutate(resid_rt = resid(sprt_residual_model))

Now that we have these, we can run a simple linear regression which will show us the effect of orthographic length on reading time. Then we add a new column in the data which is the residual reading time, or the reading time in log space AFTER we control for the effects of orthographic length.


We also want to make sure we have a column which records whether or not the trial was gender-congruent (as in ‘Shelby is a congresswoman’) or gender neutral (as in ‘Shelby is a congressperson’). We add a trial_congruency column, which is valued as ‘congruent’ if that row’s condition is one of the two congruent conditions. Otherwise, it gets valued as ‘neutral’.

sprt_data <- sprt_data %>%
  mutate(trial_congruency = ifelse(condition=='congruent_male' | condition == 'congruent_female','congruent','neutral'))


Finally, we can classify participants by their particular political alignment; we can construe this broadly as “Republicans” vs. “Democrats”, with those who declined to state a preference, or placed themselves in the middle, as “Non-Partisan”.

sprt_data <- sprt_data %>%
  mutate(poli_party = ifelse(subject_information.party_alignment == 1 | subject_information.party_alignment == 2,'Republican',ifelse(subject_information.party_alignment == 4 | subject_information.party_alignment == 5,'Democrat','Non-Partisan')))

Joining independent data Now that we have this information, we want to left join our frequency information so that we can use it in later analyses. We begin by adding the norming values’ means, of all forms.

final_spr <- left_join(sprt_data,norming_means,by="form")

Now we can add the frequency data as well, by form.

final_spr <- left_join(final_spr,frequency,by="form")

Now we can add additional lexeme-level norming information for the neutral forms, so that we can tackle the question of what role real-world expectations have on processing times.

final_spr <- left_join(final_spr,norming_means_neutral,by="lexeme")
final_spr <- subset(final_spr, select = -c(form.y,trial_count.y,trial_count.x,error,subject_information.comments,subject_information.asses,subject_information.enjoyment,subject_information.gender_q1,subject_information.gender_q2,subject_information.gender_q3,subject_information.gender_q4,subject_information.gender_q5,subject_information.gender_q6,subject_information.gender_q7,subject_information.gender_q8,subject_information.gender_q9,subject_information.gender_q10,subject_information.gender_q11,subject_information.gender_q12,subject_information.gender_q13,lexeme_norm)) %>%
  rename(form_norm = indi_mean.x, lexeme_norm = indi_mean.y, form = form.x)

1.2.3 Frequencies

frequency %>%
  ggplot(aes(x=mean_freq_left,y=mean_freq_right, label=form)) + 
  geom_point() +
  geom_text() + 
  geom_abline(intercept=0,slope=1,color="gray60") +
  coord_fixed(xlim=c(0,250))

frequency %>%
  filter(mean_freq_right < 50) %>% 
  ggplot(aes(x=mean_freq_left,y=mean_freq_right, label=form)) + 
  geom_point() +
  geom_text() + 
  geom_abline(intercept=0,slope=1,color="gray60") 

frequency %>%
  ggplot(aes(x=log_left,y=log_right, label=form)) + 
  geom_point() +
  geom_text(size=4,nudge_y=.5) + 
  geom_abline(intercept=0,slope=1,color="gray60") 

transfer_data <- final_spr %>%
  select(form,trial_gender) %>%
  unique()
temp <- left_join(frequency,transfer_data, by="form")
temp <- temp %>%
  mutate(form = fct_reorder(as.factor(form),media_diff)) %>%
   mutate(morph_type = ifelse(form!= 'actor' & form!= 'host' & form !='hunter' & form!= 'villain' & form!= 'heir' & form!= 'hero' & form!= "actress" & form!= "hostess" & form!= "huntress" & form!= "villainess" & form!= "heiress" & form!= "heroine",'compound','adoption')) %>%
  mutate(gender = ifelse(form== 'anchor' | form== 'businessperson'| form== 'camera operator' | form== 'congressperson'| form== 'craftsperson'| form== 'crewmember'| form== 'firefighter'| form== 'flight attendant'| form== 'foreperson'| form== 'layperson'| form== 'meteorologist'| form== 'police officer'| form== 'salesperson'| form== 'stunt double','neutral','gendered')) %>%
  mutate(gender = ifelse(gender == "gendered",as.character(trial_gender),gender)) %>%
  filter(!(trial_gender == "female" & gender=="neutral")) %>%
  filter(!(form=="actor" & gender=="female" | (form=="heir" & gender=="female")| (form=="hero" & gender=="female")| (form=="hunter" & gender=="female")| (form=="heir" & gender=="female")| (form=="host" & gender=="female")| (form=="villain" & gender=="female")))
temp %>%
  ggplot(aes(x=form, y=media_diff, fill=gender,alpha=morph_type)) + 
  geom_bar(stat="identity") + 
  theme(axis.text.x = element_text(angle=45, hjust = 1, vjust = 1)) + 
  scale_alpha_discrete(range = c(0.5,1))
Warning: Using alpha for a discrete variable is not advised.

final_spr %>%
  ggplot(aes(x=log_all, y=resid_rt, color=trial_gender, linetype=trial_congruency)) + 
  geom_point() + 
  geom_smooth()
`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'

final_spr %>%
  group_by(form,trial_congruency,trial_gender) %>%
  mutate(resid_rt_mean = mean(resid_rt)) %>%
  ggplot(aes(x=log_all,y=resid_rt_mean,color=trial_gender,linetype=trial_congruency)) +
  geom_point() + 
  geom_smooth(method="lm")
`geom_smooth()` using formula 'y ~ x'

final_spr %>%
  group_by(form,trial_congruency,trial_gender,morph_type) %>%
  mutate(resid_rt_mean = mean(resid_rt)) %>%
  filter(log_all > -5) %>%
  ggplot(aes(x=log_all,y=resid_rt_mean,color=trial_gender,linetype=trial_congruency,label=form,shape=trial_congruency)) +
  geom_point() + 
  geom_smooth(method="lm") + 
  geom_text(size=4,nudge_y =.03)
`geom_smooth()` using formula 'y ~ x'

final_spr %>%
  filter(!is.na(poli_party)) %>%
  group_by(form,trial_congruency,trial_gender,morph_type,poli_party) %>%
  mutate(resid_rt_mean = mean(resid_rt)) %>%
  filter(log_all > -5) %>%
  ggplot(aes(x=log_all,y=resid_rt_mean,color=trial_gender,linetype=trial_congruency,label=form,shape=trial_congruency)) +
  geom_point() + 
  geom_smooth(method="lm") + 
  geom_text(size=2,nudge_y =.03) + 
  facet_wrap(~poli_party)
`geom_smooth()` using formula 'y ~ x'

log_left, democrats

final_spr %>%
  filter(poli_party == "Democrat") %>%
  group_by(form,trial_congruency,trial_gender,morph_type) %>%
  mutate(resid_rt_mean = mean(resid_rt)) %>%
  filter(log_left > -5) %>%
  ggplot(aes(x=log_left,y=resid_rt_mean,label=form)) +
  geom_point() + 
  geom_smooth(method="lm") + 
  geom_text(size=4,nudge_y =.03)
`geom_smooth()` using formula 'y ~ x'

final_spr %>%
  filter(poli_party == "Democrat") %>%
  group_by(form,trial_congruency,trial_gender,morph_type) %>%
  mutate(resid_rt_mean = mean(resid_rt)) %>%
  filter(log_left > -5) %>%
  ggplot(aes(x=log_left,y=resid_rt_mean,color=trial_gender,linetype=trial_congruency,label=form,shape=trial_congruency)) +
  geom_point() + 
  geom_smooth(method="lm") + 
  geom_text(size=4,nudge_y =.03)
`geom_smooth()` using formula 'y ~ x'

log_all, democrats

final_spr %>%
  filter(poli_party == "Democrat") %>%
  group_by(form,trial_congruency,trial_gender,morph_type) %>%
  mutate(resid_rt_mean = mean(resid_rt)) %>%
  filter(log_left > -5) %>%
  ggplot(aes(x=log_all,y=resid_rt_mean,color=trial_gender,linetype=trial_congruency,label=form,shape=trial_congruency)) +
  geom_point() + 
  geom_smooth(method="lm") + 
  geom_text(size=4,nudge_y =.03)
`geom_smooth()` using formula 'y ~ x'

log_right, republicans

final_spr %>%
  filter(poli_party == "Republican") %>%
  group_by(form,trial_congruency,trial_gender,morph_type) %>%
  mutate(resid_rt_mean = mean(resid_rt)) %>%
  filter(log_right > -5) %>%
  ggplot(aes(x=log_right,y=resid_rt_mean,label=form)) +
  geom_point() + 
  geom_smooth(method="lm") + 
  geom_text(size=4,nudge_y =.03)
`geom_smooth()` using formula 'y ~ x'

final_spr %>%
  filter(poli_party == "Republican") %>%
  group_by(form,trial_congruency,trial_gender,morph_type) %>%
  mutate(resid_rt_mean = mean(resid_rt)) %>%
  filter(log_right > -5) %>%
  ggplot(aes(x=log_right,y=resid_rt_mean,color=trial_gender,linetype=trial_congruency,label=form,shape=trial_congruency)) +
  geom_point() + 
  geom_smooth(method="lm") + 
  geom_text(size=4,nudge_y =.03)
`geom_smooth()` using formula 'y ~ x'

log_all, republicans

final_spr %>%
  filter(poli_party == "Republican") %>%
  group_by(form,trial_congruency,trial_gender,morph_type) %>%
  mutate(resid_rt_mean = mean(resid_rt)) %>%
  filter(log_right > -5) %>%
  ggplot(aes(x=log_all,y=resid_rt_mean,color=trial_gender,linetype=trial_congruency,label=form,shape=trial_congruency)) +
  geom_point() + 
  geom_smooth(method="lm") + 
  geom_text(size=4,nudge_y =.03)
`geom_smooth()` using formula 'y ~ x'

log_left, republicans

final_spr %>%
  filter(poli_party == "Republican") %>%
  group_by(form,trial_congruency,trial_gender,morph_type) %>%
  mutate(resid_rt_mean = mean(resid_rt)) %>%
  filter(log_right > -5) %>%
  ggplot(aes(x=log_left,y=resid_rt_mean,color=trial_gender,linetype=trial_congruency,label=form,shape=trial_congruency)) +
  geom_point() + 
  geom_smooth(method="lm") + 
  geom_text(size=4,nudge_y =.03)
`geom_smooth()` using formula 'y ~ x'

cor(final_spr$log_all,final_spr$log_left)
[1] 0.9998266
cor(final_spr$log_all,final_spr$log_right)
[1] 0.8559998
cor(final_spr$log_left,final_spr$log_right)
[1] 0.8495668

1.3 Preliminary Visualisations

These plots explore single facets along which individual predictions might be made about reading times.

1.3.1 Reading Time by Norming

final_spr %>%
  ggplot(aes(x=form_norm,y=resid_rt)) +
  geom_point() + 
  geom_smooth(method='lm')
`geom_smooth()` using formula 'y ~ x'

`

final_spr %>%
  group_by(form,trial_gender,trial_congruency) %>%
  mutate(mean_resid_rt = mean(resid_rt)) %>%
  ggplot(aes(x=form_norm,y=mean_resid_rt,color=trial_gender,linetype=trial_congruency,shape=trial_congruency)) +
  geom_point() + 
  geom_smooth(method='lm')
`geom_smooth()` using formula 'y ~ x'

final_spr %>%
  group_by(form,trial_gender,trial_congruency) %>%
  mutate(mean_resid_rt = mean(resid_rt)) %>%
  ggplot(aes(x=lexeme_norm,y=mean_resid_rt,color=trial_gender,linetype=trial_congruency,shape=trial_congruency)) +
  geom_point() + 
  geom_smooth(method='lm')
`geom_smooth()` using formula 'y ~ x'

final_spr %>%
  filter(lexeme != "flight attendant") %>%
  group_by(form,trial_gender,trial_congruency) %>%
  mutate(mean_resid_rt = mean(resid_rt)) %>%
  ggplot(aes(x=lexeme_norm,y=mean_resid_rt,color=trial_gender,linetype=trial_congruency,shape=trial_congruency)) +
  geom_point() + 
  geom_smooth(method='lm')
`geom_smooth()` using formula 'y ~ x'

1.3.2 Reading Time by Frequency

Left Wing, All Items

final_spr %>%
  ggplot(aes(x=mean_freq_left,y=resid_rt)) +
  geom_point() + 
  geom_smooth(method='lm')
`geom_smooth()` using formula 'y ~ x'

Left Wing, Neutral Items

sanity = final_spr %>%
  filter(trial_congruency=="neutral")
final_spr %>%
  filter(trial_congruency=="neutral") %>%
  ggplot(aes(x=mean_freq_left,y=resid_rt)) +
  geom_point() + 
  geom_smooth(method='lm')
`geom_smooth()` using formula 'y ~ x'

Right Wing

final_spr %>%
  ggplot(aes(x=mean_freq_right,y=resid_rt)) +
  geom_point() + 
  geom_smooth(method='lm')
`geom_smooth()` using formula 'y ~ x'

final_spr %>%
  filter(trial_congruency=="neutral") %>%
  ggplot(aes(x=mean_freq_right,y=resid_rt)) +
  geom_point() + 
  geom_smooth(method='lm')
`geom_smooth()` using formula 'y ~ x'

1.3.3 Reading Time by Ideology

Gender Total

final_spr %>%
  filter(gender_total < 51) %>%
  ggplot(aes(x=gender_total,y=resid_rt,color=trial_gender,linetype=trial_congruency)) +
  geom_point() + 
  geom_smooth(method='lm') # + 
`geom_smooth()` using formula 'y ~ x'

#  facet_grid(trial_gender~trial_congruency)

Gender Link

final_spr %>%
  filter(trial_congruency == "neutral") %>%
  ggplot(aes(x=gender_link,y=resid_rt)) +
  geom_point() + 
  geom_smooth(method='lm')
`geom_smooth()` using formula 'y ~ x'

Gender Transendence

final_spr %>%
  filter(trial_congruency == "neutral") %>%
  ggplot(aes(x=gender_trans,y=resid_rt)) +
  geom_point() + 
  geom_smooth(method='lm')
`geom_smooth()` using formula 'y ~ x'

1.3.4 Reading Time by Real-World Probabilities

final_spr <- final_spr %>%
  mutate(trial_congruency = as.factor(trial_congruency)) %>%
  mutate(trial_congruency = fct_relevel(trial_congruency,"neutral")) %>%
  mutate(trial_gender = as.factor(trial_gender)) %>%
  mutate(c_gender_total = scale(gender_total,scale=FALSE)) %>%
  mutate(c_gender_trans = scale(gender_trans,scale=FALSE)) %>%
  mutate(c_gender_link = scale(gender_link,scale=FALSE)) %>%
  mutate(c_trial_gender = scale(as.numeric(trial_gender),scale=FALSE)) %>%
  mutate(c_trial_congruency = scale(as.numeric(trial_congruency),scale=FALSE))
subject_means <- final_spr %>%
  select(workerid,subject_information.party_alignment,gender_link,gender_total,gender_trans) %>%
  unique()
subject_means_w_party <- final_spr %>%
  select(workerid,subject_information.party_alignment,gender_link,gender_total,gender_trans) %>%
  filter(!is.na(subject_information.party_alignment)) %>%
  unique()

1.4 Models

1.4.1 Model One: Simple

model_one <- lmer(resid_rt~gender_total*trial_congruency*trial_gender + (1 |name) + (1|workerid) + (1|lexeme), data=final_spr)
summary(model_one)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: resid_rt ~ gender_total * trial_congruency * trial_gender + (1 |      name) + (1 | workerid) + (1 | lexeme)
   Data: final_spr

REML criterion at convergence: 3841

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.9485 -0.6000 -0.0504  0.5241  4.9619 

Random effects:
 Groups   Name        Variance  Std.Dev.
 workerid (Intercept) 0.1484466 0.38529 
 name     (Intercept) 0.0002364 0.01538 
 lexeme   (Intercept) 0.0014200 0.03768 
 Residual             0.0987091 0.31418 
Number of obs: 5342, groups:  workerid, 278; name, 24; lexeme, 20

Fixed effects:
                                                          Estimate Std. Error         df t value Pr(>|t|)  
(Intercept)                                              1.049e-01  4.651e-02  3.475e+02   2.256   0.0247 *
gender_total                                            -3.986e-03  1.545e-03  3.332e+02  -2.581   0.0103 *
trial_congruencycongruent                                8.512e-03  2.256e-02  5.045e+03   0.377   0.7060  
trial_gendermale                                        -1.356e-02  2.329e-02  4.649e+02  -0.582   0.5607  
gender_total:trial_congruencycongruent                   7.228e-04  7.672e-04  5.044e+03   0.942   0.3462  
gender_total:trial_gendermale                            1.052e-04  7.631e-04  5.040e+03   0.138   0.8904  
trial_congruencycongruent:trial_gendermale              -3.129e-02  3.182e-02  5.045e+03  -0.983   0.3254  
gender_total:trial_congruencycongruent:trial_gendermale -6.370e-04  1.079e-03  5.044e+03  -0.590   0.5550  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
               (Intr) gndr_t trl_cn trl_gn gndr_ttl:trl_c gndr_ttl:trl_g trl_:_
gender_totl    -0.822                                                          
trl_cngrncy    -0.243  0.209                                                   
tril_gndrml    -0.253  0.202  0.484                                            
gndr_ttl:trl_c  0.204 -0.249 -0.840 -0.407                                     
gndr_ttl:trl_g  0.205 -0.250 -0.422 -0.809  0.503                              
trl_cngrn:_     0.172 -0.148 -0.709 -0.680  0.595          0.593               
gndr_tt:_:_    -0.145  0.177  0.597  0.572 -0.710         -0.707         -0.840

1.4.2 Model Two: Simple model with centered variables

model_two <- lmer(resid_rt~c_gender_total*c_trial_congruency*c_trial_gender + (1 |name) + (1|workerid) + (1|lexeme), data=final_spr)
summary(model_two)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: resid_rt ~ c_gender_total * c_trial_congruency * c_trial_gender +      (1 | name) + (1 | workerid) + (1 | lexeme)
   Data: final_spr

REML criterion at convergence: 3841

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.9485 -0.6000 -0.0504  0.5241  4.9619 

Random effects:
 Groups   Name        Variance  Std.Dev.
 workerid (Intercept) 0.1484466 0.38529 
 name     (Intercept) 0.0002364 0.01538 
 lexeme   (Intercept) 0.0014200 0.03768 
 Residual             0.0987091 0.31418 
Number of obs: 5342, groups:  workerid, 278; name, 24; lexeme, 20

Fixed effects:
                                                   Estimate Std. Error         df t value Pr(>|t|)   
(Intercept)                                       2.053e-03  2.517e-02  2.554e+02   0.082  0.93508   
c_gender_total                                   -3.732e-03  1.471e-03  2.742e+02  -2.538  0.01172 * 
c_trial_congruency                                2.719e-03  8.621e-03  5.041e+03   0.315  0.75245   
c_trial_gender                                   -3.444e-02  1.067e-02  2.215e+01  -3.228  0.00385 **
c_gender_total:c_trial_congruency                 4.021e-04  5.401e-04  5.047e+03   0.745  0.45654   
c_gender_total:c_trial_gender                    -2.127e-04  5.397e-04  5.033e+03  -0.394  0.69357   
c_trial_congruency:c_trial_gender                -4.707e-02  1.724e-02  5.040e+03  -2.730  0.00635 **
c_gender_total:c_trial_congruency:c_trial_gender -6.370e-04  1.079e-03  5.044e+03  -0.590  0.55502   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
                   (Intr) c_gnd_ c_trl_c c_trl_g c_gndr_ttl:c_trl_c c_gndr_ttl:c_trl_g c_t_:__
c_gendr_ttl        -0.001                                                                     
c_trl_cngrn         0.000 -0.001                                                              
c_tril_gndr         0.000  0.000  0.002                                                       
c_gndr_ttl:c_trl_c -0.001  0.000 -0.001  -0.004                                               
c_gndr_ttl:c_trl_g -0.001 -0.001 -0.004   0.001   0.001                                       
c_trl_cn:__         0.000 -0.001  0.000   0.000  -0.005             -0.005                    
c_gn_:__:__        -0.001  0.000 -0.004  -0.004  -0.003             -0.002             -0.001 

1.4.3 Model Three: Centered Ideology, Centered Trial Congruency, and Centered Trial Gender with Random Slopes and Intercepts for Name, Workerid, and Lexeme

model_three <- lmer(resid_rt~c_gender_total*c_trial_congruency*c_trial_gender + (1 + c_gender_total + c_trial_congruency|name) + (1 + c_trial_congruency + c_trial_gender|workerid) + (1 + c_trial_congruency + c_trial_gender|lexeme), data=final_spr)
boundary (singular) fit: see ?isSingular
summary(model_three)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: resid_rt ~ c_gender_total * c_trial_congruency * c_trial_gender +      (1 + c_gender_total + c_trial_congruency | name) + (1 + c_trial_congruency +  
    c_trial_gender | workerid) + (1 + c_trial_congruency + c_trial_gender |      lexeme)
   Data: final_spr

REML criterion at convergence: 3795.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.0653 -0.5928 -0.0411  0.5204  4.7128 

Random effects:
 Groups   Name               Variance  Std.Dev.  Corr       
 workerid (Intercept)        1.486e-01 3.854e-01            
          c_trial_congruency 1.640e-03 4.050e-02  0.04      
          c_trial_gender     2.218e-03 4.710e-02 -0.23  0.89
 name     (Intercept)        2.663e-04 1.632e-02            
          c_gender_total     2.597e-09 5.096e-05 1.00       
          c_trial_congruency 1.827e-04 1.352e-02 1.00  1.00 
 lexeme   (Intercept)        1.471e-03 3.835e-02            
          c_trial_congruency 4.867e-03 6.977e-02 -0.03      
          c_trial_gender     1.374e-03 3.707e-02 -0.14 -0.62
 Residual                    9.617e-02 3.101e-01            
Number of obs: 5342, groups:  workerid, 278; name, 24; lexeme, 20

Fixed effects:
                                                   Estimate Std. Error         df t value Pr(>|t|)  
(Intercept)                                       2.545e-03  2.525e-02  2.538e+02   0.101   0.9198  
c_gender_total                                   -3.710e-03  1.471e-03  2.728e+02  -2.522   0.0122 *
c_trial_congruency                                3.237e-03  1.815e-02  1.939e+01   0.178   0.8603  
c_trial_gender                                   -3.534e-02  1.392e-02  2.086e+01  -2.538   0.0192 *
c_gender_total:c_trial_congruency                 3.884e-04  5.549e-04  2.774e+02   0.700   0.4846  
c_gender_total:c_trial_gender                    -2.474e-04  5.627e-04  2.658e+02  -0.440   0.6605  
c_trial_congruency:c_trial_gender                -4.723e-02  1.793e-02  5.853e+01  -2.634   0.0108 *
c_gender_total:c_trial_congruency:c_trial_gender -6.720e-04  1.068e-03  4.562e+03  -0.629   0.5294  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
                   (Intr) c_gnd_ c_trl_c c_trl_g c_gndr_ttl:c_trl_c c_gndr_ttl:c_trl_g c_t_:__
c_gendr_ttl         0.000                                                                     
c_trl_cngrn         0.016  0.001                                                              
c_tril_gndr        -0.070  0.000 -0.293                                                       
c_gndr_ttl:c_trl_c -0.001  0.011 -0.001  -0.003                                               
c_gndr_ttl:c_trl_g  0.000 -0.072 -0.002   0.018   0.078                                       
c_trl_cn:__         0.000 -0.001  0.000   0.148  -0.004              0.006                    
c_gn_:__:__        -0.001  0.000 -0.002  -0.003  -0.004             -0.001              0.000 
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see ?isSingular

1.4.4 Model Four

Same as Model 3, but with political orientation (5-point scale) added in without interactions

model_four <- lmer(resid_rt~c_gender_total*c_trial_congruency*c_trial_gender + subject_information.party_alignment + (1 + c_gender_total + c_trial_congruency|name) + (1 + c_trial_congruency + c_trial_gender|workerid) + (1 + c_trial_congruency + c_trial_gender|lexeme), data=final_spr)
boundary (singular) fit: see ?isSingular
summary(model_four)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: resid_rt ~ c_gender_total * c_trial_congruency * c_trial_gender +      subject_information.party_alignment + (1 + c_gender_total +  
    c_trial_congruency | name) + (1 + c_trial_congruency + c_trial_gender |      workerid) + (1 + c_trial_congruency + c_trial_gender | lexeme)
   Data: final_spr

REML criterion at convergence: 3745.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.0945 -0.5919 -0.0405  0.5237  4.7156 

Random effects:
 Groups   Name               Variance  Std.Dev.  Corr       
 workerid (Intercept)        1.460e-01 3.821e-01            
          c_trial_congruency 2.055e-03 4.534e-02  0.07      
          c_trial_gender     2.640e-03 5.138e-02 -0.25  0.78
 name     (Intercept)        2.955e-04 1.719e-02            
          c_gender_total     3.491e-09 5.908e-05 1.00       
          c_trial_congruency 2.538e-04 1.593e-02 0.99  0.99 
 lexeme   (Intercept)        1.485e-03 3.853e-02            
          c_trial_congruency 4.557e-03 6.751e-02 -0.07      
          c_trial_gender     1.441e-03 3.796e-02 -0.14 -0.59
 Residual                    9.551e-02 3.090e-01            
Number of obs: 5303, groups:  workerid, 276; name, 24; lexeme, 20

Fixed effects:
                                                   Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)                                       1.873e-01  7.160e-02  2.786e+02   2.615 0.009396 ** 
c_gender_total                                   -6.080e-03  1.713e-03  2.710e+02  -3.549 0.000456 ***
c_trial_congruency                                3.445e-03  1.785e-02  2.016e+01   0.193 0.848872    
c_trial_gender                                   -3.509e-02  1.427e-02  2.193e+01  -2.458 0.022320 *  
subject_information.party_alignment              -5.939e-02  2.137e-02  2.700e+02  -2.778 0.005846 ** 
c_gender_total:c_trial_congruency                 3.847e-04  5.600e-04  2.645e+02   0.687 0.492698    
c_gender_total:c_trial_gender                    -2.449e-04  5.679e-04  2.592e+02  -0.431 0.666590    
c_trial_congruency:c_trial_gender                -5.212e-02  1.826e-02  4.877e+01  -2.854 0.006326 ** 
c_gender_total:c_trial_congruency:c_trial_gender -3.723e-04  1.068e-03  4.512e+03  -0.349 0.727350    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
                   (Intr) c_gnd_ c_trl_c c_trl_g sbj_._ c_gndr_ttl:c_trl_c c_gndr_ttl:c_trl_g c_t_:__
c_gendr_ttl        -0.489                                                                            
c_trl_cngrn         0.004  0.001                                                                     
c_tril_gndr        -0.028  0.000 -0.269                                                              
sbjct_nfr._        -0.936  0.521  0.000   0.000                                                      
c_gndr_ttl:c_trl_c  0.000  0.017 -0.004  -0.003   0.000                                              
c_gndr_ttl:c_trl_g  0.000 -0.073 -0.002   0.018   0.000  0.082                                       
c_trl_cn:__         0.000  0.000  0.000   0.175   0.000 -0.004              0.010                    
c_gn_:__:__         0.000  0.000 -0.002  -0.003   0.000 -0.003             -0.001             -0.005 
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see ?isSingular

1.4.5 Model Five: Confirming the Statistical Difference in Ideology between Parties

model_five <- lm(gender_total~subject_information.party_alignment, data=subject_means)
summary(model_five)

Call:
lm(formula = gender_total ~ subject_information.party_alignment, 
    data = subject_means)

Residuals:
    Min      1Q  Median      3Q     Max 
-30.907 -10.293  -1.341   9.145  56.157 

Coefficients:
                                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)                          45.2966     2.1809   20.77   <2e-16 ***
subject_information.party_alignment  -6.5261     0.6449  -10.12   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 13.7 on 274 degrees of freedom
  (2 observations deleted due to missingness)
Multiple R-squared:  0.272, Adjusted R-squared:  0.2694 
F-statistic: 102.4 on 1 and 274 DF,  p-value: < 2.2e-16

1.4.6 Interim: Adding by-subject Ideology Residuals

ideo_residuals <- data.frame(
  subject_means_w_party["workerid"],
  ResidIdeo = lm(gender_total~subject_information.party_alignment, data=subject_means_w_party)$resid
)
final_spr <- left_join(final_spr,ideo_residuals,by="workerid")

1.4.7 Model Six: Residual Ideologies

Same as Model Four but with ResidualIdeologies instead of raw ideology scores

model_six <- lmer(resid_rt~ResidIdeo*c_trial_congruency*c_trial_gender + subject_information.party_alignment + (1 + ResidIdeo + c_trial_congruency|name) + (1 + c_trial_congruency + c_trial_gender|workerid) + (1 + c_trial_congruency + c_trial_gender|lexeme), data=final_spr)
Warning in checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  :
  unable to evaluate scaled gradient
Warning in checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  :
  Model failed to converge: degenerate  Hessian with 1 negative eigenvalues
Warning: Model failed to converge with 1 negative eigenvalue: -8.9e+00
summary(model_six)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: resid_rt ~ ResidIdeo * c_trial_congruency * c_trial_gender +      subject_information.party_alignment + (1 + ResidIdeo + c_trial_congruency |  
    name) + (1 + c_trial_congruency + c_trial_gender | workerid) +      (1 + c_trial_congruency + c_trial_gender | lexeme)
   Data: final_spr

REML criterion at convergence: 3743.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.1314 -0.5920 -0.0412  0.5211  4.7148 

Random effects:
 Groups   Name               Variance  Std.Dev.  Corr       
 workerid (Intercept)        1.451e-01 0.3808879            
          c_trial_congruency 1.701e-03 0.0412388  0.07      
          c_trial_gender     2.363e-03 0.0486093 -0.26  0.95
 name     (Intercept)        2.967e-04 0.0172239            
          ResidIdeo          9.888e-08 0.0003144  0.08      
          c_trial_congruency 2.763e-04 0.0166231  0.89 -0.38
 lexeme   (Intercept)        1.483e-03 0.0385117            
          c_trial_congruency 4.668e-03 0.0683233 -0.05      
          c_trial_gender     1.429e-03 0.0377993 -0.14 -0.60
 Residual                    9.564e-02 0.3092520            
Number of obs: 5303, groups:  workerid, 276; name, 24; lexeme, 20

Fixed effects:
                                              Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)                                  6.060e-02  6.219e-02  2.824e+02   0.974 0.330693    
ResidIdeo                                   -5.972e-03  1.711e-03  2.713e+02  -3.490 0.000564 ***
c_trial_congruency                           3.399e-03  1.799e-02  1.962e+01   0.189 0.852128    
c_trial_gender                              -3.509e-02  1.423e-02  2.169e+01  -2.466 0.022046 *  
subject_information.party_alignment         -1.914e-02  1.817e-02  2.717e+02  -1.053 0.293185    
ResidIdeo:c_trial_congruency                 7.228e-04  6.558e-04  3.393e+02   1.102 0.271126    
ResidIdeo:c_trial_gender                    -6.283e-04  6.776e-04  4.683e+01  -0.927 0.358584    
c_trial_congruency:c_trial_gender           -5.206e-02  1.838e-02  3.887e+01  -2.833 0.007276 ** 
ResidIdeo:c_trial_congruency:c_trial_gender  1.151e-04  1.260e-03  4.676e+03   0.091 0.927224    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
              (Intr) ResdId c_trl_c c_trl_g sbj_._ RsdId:c_trl_c RsdId:c_trl_g c__:__
ResidIdeo     -0.001                                                                 
c_trl_cngrn    0.007 -0.003                                                          
c_tril_gndr   -0.031  0.000 -0.276                                                   
sbjct_nfr._   -0.915  0.001  0.001   0.001                                           
RsdId:c_trl_c  0.000  0.018 -0.003  -0.002   0.000                                   
RsdId:c_trl_g  0.000 -0.082 -0.001   0.004   0.000  0.087                            
c_trl_cn:__   -0.001  0.000  0.000   0.164   0.001 -0.001        -0.031              
RsdId:__:__    0.000  0.000 -0.001  -0.003   0.000 -0.004        -0.001        -0.005
optimizer (nloptwrap) convergence code: 0 (OK)
unable to evaluate scaled gradient
Model failed to converge: degenerate  Hessian with 1 negative eigenvalues
final_spr %>%
  ggplot(aes(x=ResidIdeo,y=resid_rt)) + 
  geom_point() + 
  geom_smooth()
`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
Warning: Removed 39 rows containing non-finite values (stat_smooth).
Warning: Removed 39 rows containing missing values (geom_point).

1.4.8 Model Seven

Same as model six, but with added log_all frequency

model_seven <- lmer(resid_rt~ResidIdeo*c_trial_congruency*c_trial_gender + subject_information.party_alignment + log_all + (1 + ResidIdeo + c_trial_congruency|name) + (1 + c_trial_congruency + c_trial_gender|workerid) + (1 + c_trial_congruency + c_trial_gender|lexeme), data=final_spr)
Warning in checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  :
  Model failed to converge with max|grad| = 0.107412 (tol = 0.002, component 1)
summary(model_seven)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: resid_rt ~ ResidIdeo * c_trial_congruency * c_trial_gender +      subject_information.party_alignment + log_all + (1 + ResidIdeo +  
    c_trial_congruency | name) + (1 + c_trial_congruency + c_trial_gender |      workerid) + (1 + c_trial_congruency + c_trial_gender | lexeme)
   Data: final_spr

REML criterion at convergence: 3748.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.1256 -0.5940 -0.0432  0.5240  4.7045 

Random effects:
 Groups   Name               Variance  Std.Dev.  Corr       
 workerid (Intercept)        1.448e-01 0.3804817            
          c_trial_congruency 1.992e-03 0.0446374  0.06      
          c_trial_gender     2.517e-03 0.0501727 -0.25  0.77
 name     (Intercept)        2.932e-04 0.0171229            
          ResidIdeo          1.061e-07 0.0003258  0.05      
          c_trial_congruency 2.643e-04 0.0162583  0.89 -0.40
 lexeme   (Intercept)        1.477e-03 0.0384289            
          c_trial_congruency 4.233e-03 0.0650629 -0.05      
          c_trial_gender     1.367e-03 0.0369790 -0.18 -0.63
 Residual                    9.551e-02 0.3090526            
Number of obs: 5303, groups:  workerid, 276; name, 24; lexeme, 20

Fixed effects:
                                              Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)                                  6.079e-02  6.213e-02  2.832e+02   0.978 0.328686    
ResidIdeo                                   -5.968e-03  1.709e-03  2.720e+02  -3.491 0.000561 ***
c_trial_congruency                          -4.585e-03  1.780e-02  2.094e+01  -0.258 0.799299    
c_trial_gender                              -2.175e-02  1.548e-02  2.944e+01  -1.405 0.170524    
subject_information.party_alignment         -1.906e-02  1.815e-02  2.725e+02  -1.050 0.294508    
log_all                                     -6.475e-03  3.090e-03  5.965e+01  -2.096 0.040371 *  
ResidIdeo:c_trial_congruency                 7.225e-04  6.597e-04  2.811e+02   1.095 0.274368    
ResidIdeo:c_trial_gender                    -6.172e-04  6.804e-04  4.416e+01  -0.907 0.369266    
c_trial_congruency:c_trial_gender           -2.576e-02  2.222e-02  7.496e+01  -1.159 0.250120    
ResidIdeo:c_trial_congruency:c_trial_gender  1.322e-04  1.259e-03  4.465e+03   0.105 0.916372    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
              (Intr) ResdId c_trl_c c_trl_g sbj_._ log_ll RsdId:c_trl_c RsdId:c_trl_g c__:__
ResidIdeo     -0.001                                                                        
c_trl_cngrn    0.006 -0.003                                                                 
c_tril_gndr   -0.031  0.001 -0.341                                                          
sbjct_nfr._   -0.915  0.001  0.000   0.001                                                  
log_all       -0.003 -0.001  0.214  -0.411  -0.001                                          
RsdId:c_trl_c  0.000  0.018 -0.002  -0.004   0.000  0.004                                   
RsdId:c_trl_g  0.000 -0.083 -0.002   0.004   0.000 -0.005  0.079                            
c_trl_cn:__    0.001  0.000 -0.121   0.354   0.001 -0.567 -0.003        -0.024              
RsdId:__:__    0.000  0.000 -0.002   0.000   0.000 -0.007 -0.004        -0.001         0.000
optimizer (nloptwrap) convergence code: 0 (OK)
Model failed to converge with max|grad| = 0.107412 (tol = 0.002, component 1)

1.4.9 Model Eight

Same as model seven, but with added neutral lexeme-level norms

model_eight <- lmer(resid_rt~ResidIdeo*c_trial_congruency*c_trial_gender + subject_information.party_alignment + log_all + lexeme_norm + (1 + ResidIdeo + c_trial_congruency|name) + (1 + c_trial_congruency + c_trial_gender|workerid) + (1 + c_trial_congruency + c_trial_gender|lexeme), data=final_spr)
Warning in checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  :
  Model failed to converge with max|grad| = 0.0921702 (tol = 0.002, component 1)
summary(model_eight)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: resid_rt ~ ResidIdeo * c_trial_congruency * c_trial_gender +      subject_information.party_alignment + log_all + lexeme_norm +  
    (1 + ResidIdeo + c_trial_congruency | name) + (1 + c_trial_congruency +      c_trial_gender | workerid) + (1 + c_trial_congruency + c_trial_gender |      lexeme)
   Data: final_spr

REML criterion at convergence: 3754.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.1263 -0.5936 -0.0439  0.5236  4.7009 

Random effects:
 Groups   Name               Variance  Std.Dev.  Corr       
 workerid (Intercept)        1.454e-01 0.3812801            
          c_trial_congruency 1.967e-03 0.0443470  0.06      
          c_trial_gender     2.511e-03 0.0501097 -0.25  0.79
 name     (Intercept)        2.954e-04 0.0171861            
          ResidIdeo          1.061e-07 0.0003258  0.06      
          c_trial_congruency 2.683e-04 0.0163788  0.89 -0.41
 lexeme   (Intercept)        1.582e-03 0.0397699            
          c_trial_congruency 4.207e-03 0.0648591 -0.05      
          c_trial_gender     1.348e-03 0.0367197 -0.18 -0.64
 Residual                    9.550e-02 0.3090332            
Number of obs: 5303, groups:  workerid, 276; name, 24; lexeme, 20

Fixed effects:
                                              Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)                                  6.206e-02  9.187e-02  5.820e+01   0.676 0.502014    
ResidIdeo                                   -5.968e-03  1.713e-03  2.705e+02  -3.484 0.000576 ***
c_trial_congruency                          -4.675e-03  1.780e-02  2.113e+01  -0.263 0.795367    
c_trial_gender                              -2.158e-02  1.555e-02  2.994e+01  -1.388 0.175311    
subject_information.party_alignment         -1.905e-02  1.819e-02  2.708e+02  -1.047 0.296020    
log_all                                     -6.554e-03  3.195e-03  6.083e+01  -2.051 0.044555 *  
lexeme_norm                                 -3.733e-04  1.894e-02  1.852e+01  -0.020 0.984489    
ResidIdeo:c_trial_congruency                 7.226e-04  6.593e-04  2.787e+02   1.096 0.274028    
ResidIdeo:c_trial_gender                    -6.162e-04  6.803e-04  4.493e+01  -0.906 0.369868    
c_trial_congruency:c_trial_gender           -2.543e-02  2.247e-02  7.591e+01  -1.132 0.261224    
ResidIdeo:c_trial_congruency:c_trial_gender  1.302e-04  1.259e-03  4.463e+03   0.103 0.917656    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
              (Intr) ResdId c_trl_c c_trl_g sbj_._ log_ll lxm_nr RsdId:c_trl_c RsdId:c_trl_g c__:__
ResidIdeo      0.000                                                                               
c_trl_cngrn   -0.031 -0.003                                                                        
c_tril_gndr    0.040  0.001 -0.345                                                                 
sbjct_nfr._   -0.620  0.001  0.000   0.001                                                         
log_all       -0.153 -0.001  0.221  -0.422  -0.001                                                 
lexeme_norm   -0.735 -0.001  0.047  -0.083  -0.001  0.206                                          
RsdId:c_trl_c -0.003  0.016 -0.002  -0.004   0.000  0.005  0.004                                   
RsdId:c_trl_g  0.000 -0.082 -0.002   0.004   0.000 -0.005  0.000  0.080                            
c_trl_cn:__    0.084  0.001 -0.128   0.364   0.001 -0.578 -0.114 -0.004        -0.024              
RsdId:__:__    0.005  0.000 -0.003   0.001   0.000 -0.009 -0.008 -0.004        -0.001         0.001
optimizer (nloptwrap) convergence code: 0 (OK)
Model failed to converge with max|grad| = 0.0921702 (tol = 0.002, component 1)

1.4.11 Model Nine

Same as model eight, but with gender transendence

model_nine <- lmer(resid_rt~ResidTrans*c_trial_congruency*c_trial_gender + subject_information.party_alignment + log_all + lexeme_norm + (1 + ResidTrans + c_trial_congruency|name) + (1 + c_trial_congruency + c_trial_gender|workerid) + (1 + c_trial_congruency + c_trial_gender|lexeme), data=final_spr)
boundary (singular) fit: see ?isSingular
summary(model_nine)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: resid_rt ~ ResidTrans * c_trial_congruency * c_trial_gender +      subject_information.party_alignment + log_all + lexeme_norm +  
    (1 + ResidTrans + c_trial_congruency | name) + (1 + c_trial_congruency +      c_trial_gender | workerid) + (1 + c_trial_congruency + c_trial_gender |      lexeme)
   Data: final_spr

REML criterion at convergence: 3758

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.0935 -0.5927 -0.0373  0.5257  4.7167 

Random effects:
 Groups   Name               Variance  Std.Dev.  Corr       
 workerid (Intercept)        1.470e-01 0.3833548            
          c_trial_congruency 1.988e-03 0.0445818  0.07      
          c_trial_gender     2.550e-03 0.0504970 -0.22  0.70
 name     (Intercept)        2.975e-04 0.0172492            
          ResidTrans         4.020e-08 0.0002005 1.00       
          c_trial_congruency 2.208e-04 0.0148586 1.00  1.00 
 lexeme   (Intercept)        1.593e-03 0.0399168            
          c_trial_congruency 4.201e-03 0.0648160 -0.04      
          c_trial_gender     1.329e-03 0.0364620 -0.19 -0.64
 Residual                    9.551e-02 0.3090512            
Number of obs: 5303, groups:  workerid, 276; name, 24; lexeme, 20

Fixed effects:
                                               Estimate Std. Error         df t value Pr(>|t|)   
(Intercept)                                   6.176e-02  9.225e-02  5.815e+01   0.669  0.50584   
ResidTrans                                   -5.178e-03  1.783e-03  2.729e+02  -2.904  0.00399 **
c_trial_congruency                           -4.625e-03  1.774e-02  2.108e+01  -0.261  0.79685   
c_trial_gender                               -2.160e-02  1.554e-02  3.005e+01  -1.391  0.17457   
subject_information.party_alignment          -1.893e-02  1.830e-02  2.722e+02  -1.035  0.30176   
log_all                                      -6.578e-03  3.201e-03  6.059e+01  -2.055  0.04417 * 
lexeme_norm                                  -3.876e-04  1.899e-02  1.840e+01  -0.020  0.98394   
ResidTrans:c_trial_congruency                 1.083e-03  6.833e-04  2.879e+02   1.585  0.11407   
ResidTrans:c_trial_gender                    -1.199e-04  6.974e-04  1.821e+02  -0.172  0.86369   
c_trial_congruency:c_trial_gender            -2.531e-02  2.231e-02  9.790e+01  -1.135  0.25927   
ResidTrans:c_trial_congruency:c_trial_gender  5.902e-05  1.304e-03  4.452e+03   0.045  0.96391   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
                (Intr) RsdTrn c_trl_c c_trl_g sbj_._ log_ll lxm_nr RsdTrns:c_trl_c RsdTrns:c_trl_g c__:__
ResidTrans       0.001                                                                                   
c_trl_cngrn     -0.030  0.003                                                                            
c_tril_gndr      0.041  0.001 -0.348                                                                     
sbjct_nfr._     -0.621  0.001  0.000   0.001                                                             
log_all         -0.153 -0.001  0.223  -0.423  -0.001                                                     
lexeme_norm     -0.734 -0.001  0.047  -0.083  -0.001  0.206                                              
RsdTrns:c_trl_c -0.003  0.019  0.000  -0.003   0.000  0.004  0.004                                       
RsdTrns:c_trl_g  0.001 -0.076 -0.002   0.053  -0.001 -0.002 -0.001  0.072                                
c_trl_cn:__      0.085  0.000 -0.130   0.370   0.001 -0.584 -0.115 -0.002           0.029                
RsdTr:__:__      0.004  0.000 -0.001   0.000   0.000 -0.007 -0.006 -0.010          -0.005           0.003
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see ?isSingular
final_spr %>%
  ggplot(aes(x= gender_trans, y=resid_rt)) + 
  geom_point() + 
  geom_smooth(method="lm")
`geom_smooth()` using formula 'y ~ x'

1.4.12 Model Ten

Same as model nine, but with gender link

model_ten <- lmer(resid_rt~ResidLink*c_trial_congruency*c_trial_gender + subject_information.party_alignment + log_all + lexeme_norm + (1 + ResidLink + c_trial_congruency|name) + (1 + c_trial_congruency + c_trial_gender|workerid) + (1 + c_trial_congruency + c_trial_gender|lexeme), data=final_spr)
boundary (singular) fit: see ?isSingular
Warning: Model failed to converge with 1 negative eigenvalue: -1.5e+01
summary(model_ten)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: resid_rt ~ ResidLink * c_trial_congruency * c_trial_gender +      subject_information.party_alignment + log_all + lexeme_norm +  
    (1 + ResidLink + c_trial_congruency | name) + (1 + c_trial_congruency +      c_trial_gender | workerid) + (1 + c_trial_congruency + c_trial_gender |      lexeme)
   Data: final_spr

REML criterion at convergence: 3760.3

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.1355 -0.5937 -0.0434  0.5306  4.7103 

Random effects:
 Groups   Name               Variance  Std.Dev.  Corr       
 workerid (Intercept)        1.467e-01 0.3829946            
          c_trial_congruency 1.852e-03 0.0430388  0.04      
          c_trial_gender     2.255e-03 0.0474868 -0.27  0.94
 name     (Intercept)        2.890e-04 0.0169992            
          ResidLink          1.965e-07 0.0004433 -0.17      
          c_trial_congruency 2.998e-04 0.0173159  0.82 -0.70
 lexeme   (Intercept)        1.575e-03 0.0396849            
          c_trial_congruency 4.289e-03 0.0654933 -0.07      
          c_trial_gender     1.353e-03 0.0367854 -0.17 -0.64
 Residual                    9.557e-02 0.3091381            
Number of obs: 5303, groups:  workerid, 276; name, 24; lexeme, 20

Fixed effects:
                                              Estimate Std. Error         df t value Pr(>|t|)   
(Intercept)                                  6.184e-02  9.191e-02  5.931e+01   0.673  0.50368   
ResidLink                                   -3.769e-03  1.255e-03  2.710e+02  -3.004  0.00291 **
c_trial_congruency                          -4.803e-03  1.794e-02  2.100e+01  -0.268  0.79154   
c_trial_gender                              -2.143e-02  1.549e-02  2.953e+01  -1.383  0.17702   
subject_information.party_alignment         -1.907e-02  1.827e-02  2.717e+02  -1.044  0.29727   
log_all                                     -6.572e-03  3.195e-03  6.064e+01  -2.057  0.04404 * 
lexeme_norm                                 -3.031e-04  1.889e-02  1.867e+01  -0.016  0.98737   
ResidLink:c_trial_congruency                 2.348e-04  4.787e-04  3.239e+02   0.490  0.62415   
ResidLink:c_trial_gender                    -5.908e-04  5.154e-04  3.028e+01  -1.146  0.26065   
c_trial_congruency:c_trial_gender           -2.535e-02  2.260e-02  7.985e+01  -1.122  0.26533   
ResidLink:c_trial_congruency:c_trial_gender  1.268e-04  9.171e-04  4.697e+03   0.138  0.89006   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
               (Intr) RsdLnk c_trl_c c_trl_g sbj_._ log_ll lxm_nr RsdLnk:c_trl_c RsdLnk:c_trl_g c__:__
ResidLink      -0.001                                                                                 
c_trl_cngrn    -0.032 -0.010                                                                          
c_tril_gndr     0.040  0.001 -0.344                                                                   
sbjct_nfr._    -0.622  0.001  0.000   0.001                                                           
log_all        -0.152 -0.001  0.220  -0.424  -0.001                                                   
lexeme_norm    -0.733  0.000  0.047  -0.083  -0.001  0.205                                            
RsdLnk:c_trl_c -0.002  0.011 -0.003  -0.004   0.000  0.004  0.003                                     
RsdLnk:c_trl_g -0.001 -0.080 -0.002  -0.028   0.000 -0.006  0.001  0.085                              
c_trl_cn:__     0.084  0.000 -0.126   0.360   0.001 -0.575 -0.113 -0.004         -0.076               
RsdLn:__:__     0.005  0.000 -0.003   0.002   0.000 -0.008 -0.007  0.000          0.002          0.000
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see ?isSingular
final_spr %>%
  ggplot(aes(x= gender_link, y=resid_rt)) + 
  geom_point() + 
  geom_smooth(method="lm")
`geom_smooth()` using formula 'y ~ x'

1.4.13 Model Eleven

link_residuals <- data.frame(
  frequency["workerid"],
  ResidLink = lm(gender_link~subject_information.party_alignment, data=subject_means_w_party)$resid
)
final_spr <- left_join(final_spr,link_residuals,by="workerid")
final_spr <- final_spr %>%
  
model_eleven <- lmer(resid_rt~ResidIdeo * c_trial_gender + resid_lexeme_norm + log_all*poli_party(3_level) + (1 + ResidIdeo + resid_lexeme_norm + log_all*poli_party | name) + (1 + c_trial_gender + resid_lexeme_norm + log_all |workerid) + (1 + c_trial_gender + ResidIdeo + poli_party | lexeme))

1.5 Other Shit

final_spr <- final_spr %>%
  mutate(norm_skew = ifelse(lexeme_norm > 4, "female","male"))
final_spr %>%
  ggplot(aes(x=gender_link,y=gender_trans)) +
  geom_point() +
  geom_smooth(method="lm")
`geom_smooth()` using formula 'y ~ x'

final_spr %>%
  ggplot(aes(x=gender_link,y=gender_total)) +
  geom_point() +
  geom_smooth(method="lm")
`geom_smooth()` using formula 'y ~ x'

final_spr %>%
  ggplot(aes(x=gender_trans,y=gender_total)) +
  geom_point() +
  geom_smooth(method="lm")
`geom_smooth()` using formula 'y ~ x'

1.5.1 Graphs

ggplot(final_spr, aes(x=gender_total, y=resid_rt, color=norm_skew)) + 
  geom_point() + 
  geom_smooth(method="lm")
`geom_smooth()` using formula 'y ~ x'

2 Break Point: 10:09am 1 Dec

final_spr %>%
  group_by(subject_information.party_alignment) %>%
  summarize(gender_trans = mean(gender_trans)) %>%
  ggplot(aes(x=subject_information.party_alignment,y=gender_trans)) + 
  geom_bar(stat="identity") + 
  geom_jitter(data=subject_means, aes(y=gender_trans,x=subject_information.party_alignment),height=0)
final_spr %>%
  group_by(subject_information.party_alignment) %>%
  summarize(mean_gender_link = mean(gender_link)) %>%
  ggplot(aes(x=subject_information.party_alignment,y=mean_gender_link)) + 
  geom_bar(stat="identity")

Calculating Speaker Means by Condition

sprt_speaker_means <- sprt_data %>%
  group_by(condition,poli_party,workerid) %>%
  summarize(MeanRT=mean(resid_rt))

Condition Means with Participant Means

sprt_data %>%
  group_by(condition,trial_gender) %>%
  summarize(MeanRT = mean(resid_rt), CI.Low = ci.low(resid_rt), CI.High = ci.high(resid_rt)) %>%
  mutate(YMin = MeanRT - CI.Low, YMax = MeanRT + CI.High) %>%
  ggplot(aes(x=condition,y=MeanRT,color=trial_gender)) + 
  geom_point(size=3) + 
  geom_jitter(data = sprt_speaker_means, aes(y=MeanRT),alpha=.1,color='black') + 
  geom_errorbar(aes(ymin=YMin,ymax=YMax), width=.25) + 
  scale_color_manual(values = bran_palette, ) + 
  labs(x="Condition",y="Residual Reading Time", color="Trial Gender")
ggsave("sprt_all.png", width=7,height=5,path='/Users/branpap/Desktop/gender_processing/talks_and_papers/qp_paper/figures')
sprt_data %>%
  group_by(condition,trial_gender,poli_party) %>%
  summarize(MeanRT = mean(resid_rt), CI.Low = ci.low(resid_rt), CI.High = ci.high(resid_rt)) %>%
  mutate(YMin = MeanRT - CI.Low, YMax = MeanRT + CI.High) %>%
  ggplot(aes(x=condition,y=MeanRT,color=trial_gender)) + 
  geom_point(size=3) + 
  geom_jitter(data = sprt_speaker_means, aes(y=MeanRT),alpha=.1,color='black') + 
  geom_errorbar(aes(ymin=YMin,ymax=YMax), width=.25) + 
  scale_color_manual(values = bran_palette, ) + 
  labs(x="Condition",y="Residual Reading Time", color="Trial Gender") +
  facet_wrap(~poli_party)

Reading Time by Gender Ideology

Calculating Speaker Means by Ideology

sprt_speaker_means_ideology <- sprt_data %>%
  group_by(gender_total,workerid,trial_gender,trial_congruency,poli_party) %>%
  summarise(meanrt = mean(resid_rt))
sprt_speaker_means_ideology %>%
  filter(!is.na(poli_party)) %>%
  ggplot(aes(x=gender_total,y=meanrt,color=trial_gender,linetype=trial_congruency)) + 
  geom_point() + 
  geom_smooth(method='lm') + 
  scale_color_manual(values = bran_palette, ) + 
  facet_wrap(~poli_party)

Reading Time on Neologisms

sprt_data %>%
  filter(!is.na(poli_party)) %>%
  group_by(gender_total,workerid,trial_gender,poli_party,condition) %>%
  summarise(meanrt = mean(resid_rt)) %>%
  ggplot(aes(x=gender_total,y=meanrt,color=trial_gender)) + 
  geom_point() + 
  geom_smooth(method='lm') + 
  scale_color_manual(values = bran_palette, ) + 
  facet_grid(condition~poli_party) 
final_spr %>% 
  ggplot(aes(x))
sprt_data %>%
  filter(!is.na(poli_party)) %>%
  filter(trial_congruency == "neutral") %>%
  group_by(gender_trans,workerid,trial_gender,poli_party) %>%
  summarise(meanrt = mean(resid_rt)) %>%
  ggplot(aes(x=gender_trans,y=meanrt,color=trial_gender)) + 
  geom_point() + 
  geom_smooth(method='lm') + 
  scale_color_manual(values = bran_palette, ) + 
  facet_wrap(~poli_party) 
sprt_data %>%
  filter(!is.na(poli_party)) %>%
  filter(trial_congruency == "neutral") %>%
  group_by(gender_link,workerid,trial_gender,poli_party) %>%
  summarise(meanrt = mean(resid_rt)) %>%
  ggplot(aes(x=gender_link,y=meanrt,color=trial_gender)) + 
  geom_point() + 
  geom_smooth(method='lm') + 
  scale_color_manual(values = bran_palette, ) + 
  facet_wrap(~poli_party) 
sprt_data <- merge(sprt_data,lex_freqs,by="lexeme") %>%
  mutate(mean_neutral = (sum(mean_left_neutral,mean_right_neutral))/2)
sprt_data %>%
  filter(!is.na(poli_party)) %>%
  filter(trial_congruency == "neutral") %>%
  ggplot(aes(x=gender_total,y=resid_rt,color=trial_gender)) + 
  geom_point() + 
  geom_smooth(method='lm') + 
  scale_color_manual(values = bran_palette, ) + 
  labs(x="Gender Total",y="Residual Reading Time", color="Trial Gender")
ggsave("sprt_neutral_gt.png", width=7,height=5,path='/Users/branpap/Desktop/gender_processing/talks_and_papers/qp_paper/figures')

Reading Time by Item

sprt_data %>%
  group_by(condition,trial_gender,trial_congruency,lexeme) %>%
  summarize(MeanRT = mean(resid_rt), CI.Low = ci.low(resid_rt), CI.High = ci.high(resid_rt)) %>%
  mutate(YMin = MeanRT - CI.Low, YMax = MeanRT + CI.High) %>%
  ggplot(aes(x=condition,y=MeanRT,color=trial_gender,shape=trial_congruency)) + 
  geom_point(size=3) +
  geom_errorbar(aes(ymin=YMin,ymax=YMax), width=.25) + 
  facet_wrap(~ lexeme) +
  theme(axis.text.x = element_text(angle = 45, vjust = .7, hjust=.7)) + 
  scale_color_manual(values = bran_palette)

Whole-Party Means

sprt_data %>%
  filter(!is.na(poli_party)) %>%
  group_by(poli_party,condition,trial_gender,trial_congruency) %>%
  summarize(MeanRT = mean(resid_rt), CI.Low = ci.low(resid_rt), CI.High = ci.high(resid_rt)) %>%
  mutate(YMin = MeanRT - CI.Low, YMax = MeanRT + CI.High) %>%
  ggplot(aes(x=condition,y=MeanRT,color=trial_gender,shape=trial_congruency)) + 
  geom_point(size=3) +
  geom_errorbar(aes(ymin=YMin,ymax=YMax), width=.25) + 
  facet_wrap(~ poli_party, nrow = 1) +
  theme(axis.text.x = element_text(angle = 45, vjust = .7, hjust=.7)) + 
  scale_color_manual(values = bran_palette) +
  labs(x="Condition", y="Residual Reading Time", shape="Trial Congruency", color="Trial Gender")
ggsave("sprt_party.png", width=7,height=5,path='/Users/branpap/Desktop/gender_processing/talks_and_papers/qp_paper/figures')

Modelling

sprt_model <- final_spr %>%
  mutate(c_gender_total = scale(gender_total)) %>%
  mutate(cage = scale(subject_information.age)) %>%
  mutate(mean_all = (mean_freq_left + mean_freq_right)/2) %>%
  mutate(c_mean_all = scale(mean_all)) %>%
  mutate(c_trial_congruency = as.numeric(as.factor(trial_congruency))-mean(as.numeric(as.factor(trial_congruency)))) %>%
  mutate(c_trial_gender = as.numeric(as.factor(trial_gender))-mean(as.numeric(as.factor(trial_gender)))) %>%
  mutate(c_indi_mean = scale(indi_mean))
complex_model <- lmer(resid_rt~c_trial_congruency + c_gender_total + poli_party + c_mean_all + c_indi_mean + (1|workerid) + (1|lexeme) + (1|name),data = sprt_model)
summary(complex_model)

2.0.1 Auxiliary Analysis: Republicans

final_spr %>%
  filter(poli_party == "Republican") %>%
  group_by(proliferate.condition,condition,trial_gender,trial_congruency) %>%
  summarize(MeanRT = mean(resid_rt), CI.Low = ci.low(resid_rt), CI.High = ci.high(resid_rt)) %>%
  mutate(YMin = MeanRT - CI.Low, YMax = MeanRT + CI.High) %>%
  ggplot(aes(x=condition,y=MeanRT,color=trial_gender,shape=trial_congruency)) + 
  geom_point(size=3) +
  geom_errorbar(aes(ymin=YMin,ymax=YMax), width=.25) + 
  facet_wrap(~ proliferate.condition, nrow = 1) +
  theme(axis.text.x = element_text(angle = 45, vjust = .7, hjust=.7)) + 
  scale_color_manual(values = bran_palette) +
  labs(x="Condition", y="Residual Reading Time", shape="Trial Congruency", color="Trial Gender")
spr_republicans <- sprt_model %>%
  filter(poli_party == "Republican")
repub_model <- lmer(resid_rt ~ proliferate.condition + (1|workerid) + (1|name) + (1|lexeme),data=spr_republicans)
summary(repub_model)

2.1 Production Task Study

2.1.1 Methods

2.1.2 Analysis

Data Read-in

prod_data <- read.csv("production_data.csv")

Exclusions

prod_exclusion <- prod_data %>% filter(name=='attention') %>%
  group_by(workerid) %>%
  summarise(accuracy = mean(correct)) %>%
  mutate(exclude = ifelse(accuracy < 0.80,'Yes','No')) %>%
  filter(exclude == "Yes")
prod_data <- prod_data[!(prod_data$workerid %in% prod_exclusion$workerid),]

Additional Information

prod_data <- prod_data %>%
  mutate(gender_trans = 100 - (rowMeans(prod_data[gender_transcendence_cols]))) %>%
  mutate(gender_link = rowMeans(prod_data[gender_linked_cols])) 

gender_all = c('gender_trans','gender_link')

prod_data <- prod_data %>%
  mutate(gender_total = rowMeans(prod_data[gender_all]))
prod_data <- prod_data %>%
  filter(type == "critical") %>%
  mutate(response_gender = ifelse(response == "actress" | response == "anchorwoman" | response == "stewardess" | response == "businesswoman" | response == 'camerawoman' | response == 'congresswoman' | response == 'craftswoman' | response == 'crewwoman' | response == 'firewoman' | response == 'forewoman'  | response == 'heiress' | response == 'heroine' | response == 'hostess' | response == 'huntress' | response == 'laywoman' | response == 'policewoman' | response == 'saleswoman' | response == 'stuntwoman' | response == 'villainess' | response == 'weatherwoman',"female",ifelse(response == "anchor" | response == "flight attendant" | response == "businessperson" | response == 'camera operator' | response == 'congressperson' | response == 'craftsperson' | response == 'crewmember' | response == 'firefighter' | response == 'foreperson' | response == 'layperson' | response == 'police officer' | response == 'salesperson' | response == 'stunt double' | response == 'meteorologist',"neutral",ifelse(response == "anchorman" | response == "steward" | response == "businessman" | response == 'cameraman' | response == 'congressman' | response == 'craftsman' | response == 'crewman' | response == 'fireman' | response == 'foreman' | response == 'layman' | response == 'policeman' | response == 'salesman' | response == 'stuntman' | response == 'weatherman',"male",'male/neutral')))) %>%
  mutate(congruency = ifelse(gender == response_gender,"true","false")) %>%
  mutate(neutrality = ifelse(response_gender == "neutral","true","false"))%>%
  mutate(morph_type = ifelse(lexeme!= 'actor' & lexeme!= 'host' & lexeme !='hunter' & lexeme!= 'villain' & lexeme!= 'heir' & lexeme!= 'hero','compound','adoption')) %>%
  mutate(poli_party = ifelse(subject_information.party_alignment == 1 | subject_information.party_alignment == 2,'Republican',ifelse(subject_information.party_alignment == 4 | subject_information.party_alignment == 5,'Democrat','Non-Partisan'))) %>%
  mutate(response_neutral = ifelse(response_gender == "neutral" | response_gender == "male/neutral",1,0))
prod_final <- left_join(prod_data,norming_means_neutral,by="lexeme")
prod_final <- left_join(prod_final,real_dists,by="lexeme")

2.2 Preliminary Visualisations

2.2.1 Neutral Production Rate by Norming

prod_final %>% 
  group_by(lexeme,indi_mean) %>%
  summarize(mean_prop = mean(response_neutral)) %>%
  ggplot(aes(x=indi_mean,y=mean_prop,label=lexeme)) +
  geom_point() +
  geom_text() +
  geom_smooth(method="lm")

Responses by Political Ideology

prod_data %>% 
  filter(!is.na(poli_party)) %>%
  filter(morph_type =="compound") %>%
  ggplot(aes(x=poli_party, fill=response_gender)) + 
  geom_bar(position="fill") + 
  facet_wrap(~gender) + 
  scale_fill_manual(values = bran_palette) + 
  labs(x="Participant Political Party", fill="Gender of Response", y="Proportion of Responses", title="Gender of Response by Gender of Stimulus Name") + 
  theme(text=element_text(size=15)) + 
  theme(axis.text.x = element_text(angle=25))
ggsave("prod_all_poli.png", width=7,height=5,path='/Users/branpap/Desktop/gender_processing/talks_and_papers/qp_paper/figures')
prod_data %>% 
  filter(!is.na(subject_information.party_alignment)) %>%
  filter(morph_type =="compound") %>%
  ggplot(aes(x=subject_information.party_alignment, fill=response_gender)) + 
  geom_bar(position="fill") + 
  facet_wrap(~gender) + 
  scale_fill_manual(values = bran_palette) + 
  labs(x="Participant Political Party", fill="Gender of Response", y="Proportion of Responses", title="Gender of Response by Gender of Stimulus Name")

Gender of Response by Political Alignment and Gender Ideology

prod_data %>%
  filter(!is.na(poli_party)) %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="" & morph_type=="compound") %>%
  group_by(gender,gender_total,poli_party) %>%
  summarise(proportion = mean(response_neutral)) %>%
  ggplot(aes(x=gender_total, y=proportion, color=gender)) +
    geom_point() + 
    geom_smooth() + 
    scale_color_manual(values = bran_palette) +
    facet_wrap(~poli_party) + 
    labs(x="Gender Ideology Score", y="Proportion of Gender Neutral Responses",color="Gender of Name Seen") + 
    theme(text=element_text(size=15))
ggsave("prod_neutral_poli.png", width=10,height=5,path='/Users/branpap/Desktop/gender_processing/talks_and_papers/qp_paper/figures')
prod_data %>%
  filter(!is.na(poli_party)) %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="") %>%
  group_by(gender,subject_information.age,poli_party) %>%
  summarise(proportion = mean(response_neutral)) %>%
  ggplot(aes(x=subject_information.age, y=proportion, color=gender)) +
    geom_point() + 
    geom_smooth() + 
    scale_color_manual(values = bran_palette) 
prod_data %>%
  filter(!is.na(poli_party)) %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="") %>%
  group_by(gender,workerid,poli_party) %>%
  summarise(proportion = mean(response_neutral)) %>%
  ggplot(aes(x=poli_party, y=proportion, fill=poli_party)) +
    geom_boxplot(varwidth = T) + 
    scale_fill_manual(values=bran_palette) + 
    facet_wrap(~gender) + 
  theme(legend.position = "none") + 
  labs(x="Participant Political Party", y="Proportion",title="Mean Prop. of Neutral Responses by Stimuli Gender") + 
  theme(text=element_text(size=16)) + 
  theme(axis.text.x = element_text(angle=20))
ggsave("prod_neutral_poli_box.png", width=7, height=5,path='/Users/branpap/Desktop/gender_processing/talks_and_papers/qp_paper/figures')

Gender by Gender, no Ideology

prod_data %>%
  filter(morph_type =="compound") %>%
  ggplot(aes(x=gender, fill=response_gender)) + 
  geom_bar(position="fill") + 
  scale_fill_manual(values = bran_palette) + 
  labs(x="Stimulus Gender", fill="Gender of Response", y="Proportion of Responses", title="Gender of Response by Gender of Stimulus Name") +
  theme_minimal() + 
  geom_errorbar(aes(ymin=))

Models

prod_data_compounds <- prod_data %>%
  filter(morph_type == "compound") %>%
  mutate(cgender_total = scale(gender_total)) %>%
  mutate(response_congruency = as.numeric(ifelse(congruency=="true","1","0"))) %>%
  mutate(cage = scale(subject_information.age)) %>%
  mutate(neutrality_binary = ifelse(neutrality=="true",1,0))
final_dat <- merge(prod_data_compounds,lex_freqs,by="lexeme") %>%
  mutate(neutrality_binary = ifelse(neutrality=="true",1,0)) %>%
  filter(morph_type == "compound") %>%
  mutate(cgender_total = scale(gender_total)) %>%
  mutate(response_congruency = as.numeric(ifelse(congruency=="true","1","0"))) %>%
  mutate(cage = scale(subject_information.age)) %>%
  mutate(cmean_left_neutral = scale(mean_left_neutral)) %>%
  mutate(mean_all = (mean_left_neutral + mean_right_neutral)/2) %>%
  mutate(cmean_all = scale(mean_all))
production_model_one <- lmer(neutrality_binary~cgender_total + poli_party + gender + cmean_all + (1|workerid) + (1|lexeme) + (1|name),data=final_dat)
summary(production_model_one)

3 Some Prop Tables

(table(prod_data$subject_information.gender))
prod_gender_table <- prod_data %>%
  group_by(workerid,subject_information.gender,poli_party) %>%
  summarise(subject_gender = paste(unique(subject_information.gender)))

table(prod_gender_table$subject_gender,prod_gender_table$poli_party)
prod_data_all <- read.csv("production_data.csv") %>%
  filter(type=="filler_semantic" | type=="filler_grammatical") %>%
  group_by(lexeme,type) %>%
  summarise(lexeme=paste(unique(lexeme)))
table(prod_data_all$type)
participant ages <- final_spr %>%
Error: unexpected symbol in "participant ages"
participant_ages %>%
  filter(!is.na(poli_party)) %>%
  ggplot(aes(x=subject_information.age, fill=poli_party)) + 
  geom_density(alpha=.3, position="identity")
Warning: Removed 2 rows containing non-finite values (stat_density).

final_spr %>%
  filter(!is.na(poli_party)) %>%
  filter(!is.na(young_old)) %>%
  filter(poli_party != "Non-Partisan") %>%
  group_by(form,poli_party,young_old) %>%
  mutate(resid_rt_mean = mean(resid_rt)) %>%
  filter(log_all > -5) %>%
  ggplot(aes(x=log_all,y=resid_rt_mean,label=form)) +
  geom_point() + 
  geom_smooth(method="lm") + 
  geom_text(size=4,nudge_y =.03) + 
  facet_grid(young_old~poli_party)
`geom_smooth()` using formula 'y ~ x'

final_spr %>%
  filter(!is.na(poli_party)) %>%
  filter(!is.na(young_old)) %>%
  filter(media_source > -5) %>%
  group_by(form,poli_party,young_old) %>%
  mutate(resid_rt_mean = mean(resid_rt)) %>%
  filter(log_all > -5) %>%
  ggplot(aes(x=media_source,y=resid_rt_mean,label=form)) +
  geom_point() + 
  geom_smooth(method="lm") + 
  geom_text(size=4,nudge_y =.03) + 
  facet_grid(young_old~poli_party)
`geom_smooth()` using formula 'y ~ x'

final_spr %>%
  filter(!is.na(poli_party)) %>%
  filter(!is.na(young_old)) %>%
  filter(poli_party != "Non-Partisan") %>%
  filter(media_source > -5) %>%
  group_by(form,poli_party,young_old) %>%
  mutate(resid_rt_mean = mean(resid_rt)) %>%
  ungroup() %>%
  filter(log_all > -5) %>%
  group_by(poli_party,young_old) %>%
  summarise(mean = mean(media_source))
`summarise()` has grouped output by 'poli_party'. You can override using the `.groups` argument.
cors_window = temp %>% 
  group_by(poli_party,young_old) %>% 
  summarize(Correlation=round(cor.test(media_source,resid_rt_mean)$estimate,2),P=round(cor.test(media_source,resid_rt_mean)$p.value,5))
`summarise()` has grouped output by 'poli_party'. You can override using the `.groups` argument.
cors_window
cors_log_all = temp %>% 
  group_by(poli_party,young_old) %>% 
  summarize(Correlation=round(cor.test(log_all,resid_rt_mean)$estimate,2),P=round(cor.test(log_all,resid_rt_mean)$p.value,5))
`summarise()` has grouped output by 'poli_party'. You can override using the `.groups` argument.
cors_log_all
temp %>%
  cor(media_source, resid_rt_mean)
Error in pmatch(use, c("all.obs", "complete.obs", "pairwise.complete.obs",  : 
  object 'resid_rt_mean' not found
cor(temp$media_source,temp$resid_rt_mean)
[1] -0.1687425
table(dem_temp$poli_party,dem_temp$subject_information.age, na.rm=TRUE)
Error in table(dem_temp$poli_party, dem_temp$subject_information.age,  : 
  all arguments must have the same length
table(final_spr$young_old,final_spr$poli_party)
       
        Democrat Non-Partisan Republican
  old        366          239        530
  young     1829          895       1404
final_spr %>%
  filter(!is.na(poli_party)) %>%
  filter(!is.na(subject_information.age)) %>%
  filter(trial_congruency == "neutral") %>%
  filter(lexeme != "flight attendant") %>%
  group_by(lexeme,trial_gender,poli_party,young_old) %>%
  mutate(lex_mean = mean(resid_rt)) %>%
  ggplot(aes(x=lexeme_norm,y=lex_mean, color=trial_gender,label=lexeme)) + 
  geom_point() + 
  geom_text() + 
  geom_smooth(method="lm") + 
  facet_grid(young_old~poli_party)
`geom_smooth()` using formula 'y ~ x'

final_spr %>%
  filter(trial_congruency == "neutral") %>%
  filter(lexeme != "flight attendant") %>%
  ggplot(aes(x=lexeme_norm, y=log_all)) + 
  geom_point() + 
  geom_smooth(method="lm")
`geom_smooth()` using formula 'y ~ x'

final_spr %>%
  filter(!is.na(poli_party)) %>%
  filter(trial_congruency == "neutral") %>%
  filter(lexeme != "flight attendant") %>%
  mutate(freq_high_low = cut_interval(log_all,n=2,labels=c("low","high"))) %>%
  ggplot(aes(x=lexeme_norm, y=log_all)) + 
  geom_point() + 
  geom_smooth(method="lm") + 
  facet_grid(freq_high_low~poli_party)
`geom_smooth()` using formula 'y ~ x'

final_spr %>%
  filter(!is.na(poli_party)) %>%
  filter(trial_congruency == "neutral") %>%
  filter(lexeme != "flight attendant") %>%
  mutate(freq_high_low = cut_interval(log_all,n=2,labels=c("low","high"))) %>%
  group_by(lexeme,trial_gender,poli_party,freq_high_low,lexeme_norm) %>%
  summarise(lex_mean = mean(resid_rt)) %>%
  ggplot(aes(x=lexeme_norm, y=lex_mean,color=trial_gender)) + 
  geom_point() + 
  geom_smooth(method="lm") + 
  facet_grid(freq_high_low~poli_party)
`summarise()` has grouped output by 'lexeme', 'trial_gender', 'poli_party', 'freq_high_low'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'

cors_poli_norm = temp_two %>% 
  group_by(poli_party,lexeme_norm) %>% 
  summarize(Correlation=round(cor.test(lexeme_norm,resid_rt_mean)$estimate,2),P=round(cor.test(lexeme_norm,resid_rt_mean)$p.value,5))
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
Warning in cor(x, y) : the standard deviation is zero
`summarise()` has grouped output by 'poli_party'. You can override using the `.groups` argument.
final_spr %>%
  group_by(trial_gender,trial_congruency,morph_type) %>%
  summarize(MeanRT = mean(resid_rt), CI.Low = ci.low(resid_rt), CI.High = ci.high(resid_rt)) %>%
  mutate(YMin = MeanRT - CI.Low, YMax = MeanRT + CI.High) %>%
  ggplot(aes(x=morph_type,y=MeanRT,color=trial_gender)) + 
  geom_point() + 
  geom_errorbar(aes(ymin=YMin,ymax=YMax), width=.25) + 
  facet_wrap(~trial_congruency)
`summarise()` has grouped output by 'trial_gender', 'trial_congruency'. You can override using the `.groups` argument.


  1. It is my hope and intention that this color palette be color-blind friendly. If you have accessibility concerns, please do not hesitate to reach out to me!↩︎

  2. This amounts to an hourly rate of $20.73. We originally anticipated that participants would take an average of 7 minutes to complete the experiment, and set the base pay at $15 an hour.↩︎

LS0tCnRpdGxlOiAiU2FsbHkgdGhlIENvbmdyZXNzcGVyc29uOiBBIFBzeWNoby0gYW5kIFNvY2lvbGluZ3Vpc3RpYyBJbnZlc3RpZ2F0aW9uIGludG8gdGhlIFJlbGF0aW9uc2hpcCBCZXR3ZWVuIElkZW9sb2d5LCBHZW5kZXIsIGFuZCBMYW5ndWFnZSIKYXV0aG9yOiAiQi4gUGFwaW5lYXUiCmRhdGU6ICJBdXR1bW4gMjAyMSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IG5vCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdGhlbWU6IGpvdXJuYWwKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIGRmX3ByaW50OiBwYWdlZAotLS0KCiMgSW50cm9kdWN0aW9uIApUaGUgY29kZSBhbmQgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBjb25zdGl0dXRlcyB0aGUgY29tcGxldGUgd3JpdGUtdXAgb2YgdGhlIGV4cGVyaW1lbnRzIEkgY2FycmllZCBvdXQgZm9yIG15IGZpcnN0IFF1YWxpZnlpbmcgUGFwZXIgdG93YXJkcyB0aGUgUGhEIGluIExpbmd1aXN0aWNzIGF0IFN0YW5mb3JkIFVuaXZlcnNpdHkuIFRoZSBnb2FsIGlzIHRvIG1ha2UgdGhpcyBkb2N1bWVudCBib3RoIGEgZHVtcGluZyBncm91bmQgZm9yIG15IGlkZWFzIHdoaWxlIGl0IGlzIGluIHByb2dyZXNzLCBhcyB3ZWxsIGFzLCBldmVudHVhbGx5LCBhIHB1YmxpY2x5LWF2YWlsYWJsZSB2ZXJzaW9uIG9mIG15IFF1YWxpZnlpbmcgUGFwZXIsIGluIHRoZSBzcGlyaXQgb2YgT3BlbiBTY2llbmNlLgoKIyMgUHJlbGltaW5hcmllcyAKCiMjIyBTZXR0aW5nIHVwIHRoZSBOb3RlYm9vawoKRm9yIHRoaXMgd3JpdGUtdXAgYW5kIGFuYWx5c2lzLCBJIHJlcXVpcmUgdGhlIGZvbGxvd2luZyBwYWNrYWdlcywgbG9hZGVkIGluIGhlcmU6CgpgYGB7ciBlY2hvPVRSVUV9CmxpYnJhcnkoZ2dwbG90MikgCmxpYnJhcnkodGlkeXZlcnNlKSAKbGlicmFyeShsbWU0KSAKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KGxhbmd1YWdlUikKbGlicmFyeShsbWVyVGVzdCkKbGlicmFyeShyZXNoYXBlMikKbGlicmFyeShncmlkKQoKc291cmNlKCJoZWxwZXJzLlIiKQpgYGAKCkkgYWxzbyB1c2UgYSBjdXN0b20gY29sb3IgcGFsZXR0ZSwgc28gSSBpbmNsdWRlIHRoZSBjb2RlIGZvciB0aGF0IGhlcmUgYXMgd2VsbF5bSXQgaXMgbXkgaG9wZSBhbmQgaW50ZW50aW9uIHRoYXQgdGhpcyBjb2xvciBwYWxldHRlIGJlIGNvbG9yLWJsaW5kIGZyaWVuZGx5LiBJZiB5b3UgaGF2ZSBhY2Nlc3NpYmlsaXR5IGNvbmNlcm5zLCBwbGVhc2UgZG8gbm90IGhlc2l0YXRlIHRvIHJlYWNoIG91dCB0byBtZSFdLgoKYGBge3J9CmJyYW5fcGFsZXR0ZSA9IGMoIiM3YWU3ZTUiLCAiI2ZlNWY1NSIsICIjQjJBNkRFIiwgIiMxNDM0MmIiLCAiIzY5Mzg1YyIpCgp0aGVtZV9zZXQodGhlbWVfbWluaW1hbCgpKQpgYGAKCiMjIyBGcmVxdWVuY3kgRGF0YQoKV2UgYWxzbyBuZWVkIHRoZSBmcmVxdWVuY3kgZGF0YSEKCmBgYHtyfQpmcmVxdWVuY3kgPC0gcmVhZC5jc3YoImZyZXFfdmFscy5jc3YiKQpgYGAKCmBgYHtyfQpsaWJfY29scyA8LSBjKCdBQkMnLCdDTk4nLCdQQlMnLCdOQkMnLCdNU05CQycsJ05QUicsJ0NCUycpCmBgYAoKYGBge3J9CmZyZXF1ZW5jeSA8LSBmcmVxdWVuY3kgJT4lCiAgbXV0YXRlKHRvdGFsX2xlZnQgPSByb3dTdW1zKGZyZXF1ZW5jeVtsaWJfY29sc10pKSAlPiUKICBtdXRhdGUodG90YWxfcmlnaHQgPSBGT1gpICU+JQogIG11dGF0ZShhbGxfd3BtID0gKCh0b3RhbF9sZWZ0ICsgdG90YWxfcmlnaHQpIC8gMTIxNTAwMDAwKSAqIDEwMDAwMDApICU+JQogIG11dGF0ZShsZWZ0X3dwbSA9ICh0b3RhbF9sZWZ0LzEwOTMwMDAwMCkgKiAxMDAwMDAwKSAlPiUKICBtdXRhdGUocmlnaHRfd3BtID0gKHRvdGFsX3JpZ2h0LzEyMjAwMDAwKSAqIDEwMDAwMDApICU+JQogIG11dGF0ZShuZXV0cmFsX2JpbmFyeSA9IGlmZWxzZShnZW5kZXI9PSJuZXV0cmFsIiwxLDApKSAlPiUKICBtdXRhdGUobW9ycGhfdHlwZSA9IGlmZWxzZShsZXhlbWUhPSAnYWN0b3InICYgbGV4ZW1lIT0gJ2hvc3QnICYgbGV4ZW1lICE9J2h1bnRlcicgJiBsZXhlbWUhPSAndmlsbGFpbicgJiBsZXhlbWUhPSAnaGVpcicgJiBsZXhlbWUhPSAnaGVybycsJ2NvbXBvdW5kJywnYWRvcHRpb24nKSkgCmBgYAoKYGBge3J9CmZyZXF1ZW5jeSA8LSBmcmVxdWVuY3kgJT4lCiAgZ3JvdXBfYnkod29yZCkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZnJlcV9sZWZ0ID0gbWVhbihsZWZ0X3dwbSksIG1lYW5fZnJlcV9yaWdodCA9IG1lYW4ocmlnaHRfd3BtKSwgbWVhbl9mcmVxX2FsbCA9IG1lYW4oYWxsX3dwbSkpICU+JQogIHJlbmFtZShmb3JtID0gd29yZCkKYGBgCgpSZS13cml0ZSBmcmVxdWVuY3kgdG8gYXZvaWQgemVybyBudW1iZXJzIQoKYGBge3J9CmZyZXF1ZW5jeVtmcmVxdWVuY3kgPT0gMC4wMDAwMDAwMF0gPC0gMC4wMDAxCmBgYAoKVGFrZSBsb2cgZnJlcXVlbmN5IG9mIGVhY2ggbWVkaWEgdHlwZS4KCmBgYHtyfQpmcmVxdWVuY3kgPC0gZnJlcXVlbmN5ICU+JQogIG11dGF0ZShsb2dfcmlnaHQgPSBsb2cobWVhbl9mcmVxX3JpZ2h0KSwgbG9nX2xlZnQgPSBsb2cobWVhbl9mcmVxX2xlZnQpLCBsb2dfYWxsID0gbG9nKG1lYW5fZnJlcV9hbGwpKSAKYGBgCgpDcmVhdGUgbWVkaWEgZGlmZmVyZW5jZSAKCmBgYHtyfQpmcmVxdWVuY3kgPC0gZnJlcXVlbmN5ICU+JSAKICBtdXRhdGUobWVkaWFfZGlmZiA9IGxvZ19sZWZ0IC0gbG9nX3JpZ2h0KSAlPiUKICBtdXRhdGUobm9uZXhpc3RlbnQgPSBpZmVsc2UobWVkaWFfZGlmZiA9PSAwICYgbG9nX2xlZnQgPCAtNCwidHJ1ZSIsImZhbHNlIikpCmBgYAoKIyMjIE5vcm1pbmcgRGF0YQoKQW5kIGhlcmUgaXMgdGhlIG5vcm1pbmcgZGF0YSB2YWx1ZXM6CgpgYGB7ciBFQ0hPPVRSVUV9Cm5vcm1pbmdfZGF0YSA8LSByZWFkLmNzdigibm9ybWluZ19kYXRhLmNzdiIpICU+JQogIGZpbHRlcihpZCE9ImV4YW1wbGUxIikgJT4lICMgV2lsbCBmaWx0ZXIgb3V0IG5vbi1jcml0aWNhbCB0cmlhbHMsIGkuZS4gdGhlIGV4YW1wbGUgdHJpYWwgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBleHBlcmltZW50CiAgbXV0YXRlKGVxdWFsaXplZF9yZXNwb25zZSA9IGlmZWxzZShzY2FsZT09IkZNIiw4LXJlc3BvbnNlLHJlc3BvbnNlKSkgJT4lICMgVGhpcyB3aWxsIHJlbmRlciBhbGwgZGF0YSBwb2ludHMgb24gdGhlIHNhbWUgc2NhbGUsIGFzIHBhcnRpY2lwYW50cyByYW5kb21seSByZWNlaXZlZCBlaXRoZXIgInZlcnkgbGlrZWx5IGEgbWFuIiBvciAidmVyeSBsaWtlbHkgYSB3b21hbiIgYXMgdGhlIGxlZnQgZW5kIG9mIHRoZWlyIHJlc3BvbnNlIHNjYWxlLCB3aXRoIHRoZSBvdGhlciBhcHBlYXJpbmcgYXQgdGhlIHJpZ2h0IGVuZAogIG11dGF0ZShvcnRob2cgPSBpZmVsc2Uob3J0aG9nPT0ic3JvY2VyZXNzIiwic29yY2VyZXNzIixvcnRob2cpKSAlPiUgIyBGaXhlcyBhIHR5cG8KICBtdXRhdGUoaWQgPSBpZmVsc2UoaWQ9PSJTdHVudF9kb3VibGUiLCJzdHVudCBkb3VibGUiLGlkKSkgJT4lICMgVGhpcywgYXMgd2VsbCBhcyBhbGwgbGluZXMgYmVsb3cgaXQsIGNvbnZlcnQgY29tcG91bmRzIGZvcm1lZCBieSBzcGFjZXMgZnJvbSB0aGVpciB1bmRlcnNjb3JlIGZvcm1zIHRvIHRoZWlyIHNwYWNlZCBmb3JtcyAoZS5nLiBwb2xpY2Vfb2ZmaWNlciAtPiBQb2xpY2Ugb2ZmaWNlcikKICBtdXRhdGUoaWQgPSBpZmVsc2UoaWQ9PSJQb2xpY2Vfb2ZmaWNlciIsInBvbGljZSBvZmZpY2VyIixpZCkpICU+JQogIG11dGF0ZShpZCA9IGlmZWxzZShpZD09IkZsaWdodF9hdHRlbmRhbnQiLCJmbGlnaHQgYXR0ZW5kYW50IixpZCkpICU+JQogIG11dGF0ZShpZCA9IGlmZWxzZShpZD09IkFuY2hvciIsImFuY2hvciIsaWQpKSAlPiUKICBtdXRhdGUoaWQgPSBpZmVsc2UoaWQ9PSJCdXNpbmVzc3BlcnNvbiIsImJ1c2luZXNzcGVyc29uIixpZCkpICU+JQogICBtdXRhdGUoaWQgPSBpZmVsc2UoaWQ9PSJDYW1lcmEiLCJjYW1lcmEgb3BlcmF0b3IiLGlkKSkgJT4lCiAgbXV0YXRlKGlkID0gaWZlbHNlKGlkPT0iQ29uZ3Jlc3NwZXJzb24iLCJjb25ncmVzc3BlcnNvbiIsaWQpKSAlPiUKICBtdXRhdGUoaWQgPSBpZmVsc2UoaWQ9PSJDcmFmdHNwZXJzb24iLCJjcmFmdHNwZXJzb24iLGlkKSkgJT4lCiAgbXV0YXRlKGlkID0gaWZlbHNlKGlkPT0iQ3Jld21lbWJlciIsImNyZXdtZW1iZXIiLGlkKSkgJT4lCiAgbXV0YXRlKGlkID0gaWZlbHNlKGlkPT0iRmlyZWZpZ2h0ZXIiLCJmaXJlZmlnaHRlciIsaWQpKSAlPiUKICBtdXRhdGUoaWQgPSBpZmVsc2UoaWQ9PSJGb3JlcGVyc29uIiwiZm9yZXBlcnNvbiIsaWQpKSAlPiUKICBtdXRhdGUoaWQgPSBpZmVsc2UoaWQ9PSJMYXlwZXJzb24iLCJsYXlwZXJzb24iLGlkKSkgJT4lCiAgbXV0YXRlKGlkID0gaWZlbHNlKGlkPT0iTWV0ZW9yb2xvZ2lzdCIsIm1ldGVvcm9sb2dpc3QiLGlkKSkgJT4lCiAgbXV0YXRlKGlkID0gaWZlbHNlKGlkPT0iU2FsZXNwZXJzb24iLCJzYWxlc3BlcnNvbiIsaWQpKSAlPiUKICBtdXRhdGUoaWQgPSBpZmVsc2UoaWQ9PSJBY3RvciIsImFjdG9yIixpZCkpICU+JQogIG11dGF0ZShpZCA9IGlmZWxzZShpZD09IkhlaXIiLCJoZWlyIixpZCkpICU+JQogIG11dGF0ZShpZCA9IGlmZWxzZShpZD09Ikhlcm8iLCJoZXJvIixpZCkpICU+JQogIG11dGF0ZShpZCA9IGlmZWxzZShpZD09Ikhvc3QiLCJob3N0IixpZCkpICU+JQogIG11dGF0ZShpZCA9IGlmZWxzZShpZD09Ikh1bnRlciIsImh1bnRlciIsaWQpKSAlPiUKICBtdXRhdGUoaWQgPSBpZmVsc2UoaWQ9PSJWaWxsYWluIiwidmlsbGFpbiIsaWQpKSAlPiUKICBtdXRhdGUob3J0aG9nID0gaWZlbHNlKG9ydGhvZz09ImFpcmxpbmUgc3Rld2FyZCIsInN0ZXdhcmQiLG9ydGhvZykpICU+JQogIG11dGF0ZShvcnRob2cgPSBpZmVsc2Uob3J0aG9nPT0iYWlybGluZSBzdGV3YXJkZXNzIiwic3Rld2FyZGVzcyIsb3J0aG9nKSkKYGBgCgpgYGB7ciBFQ0hPPVRSVUV9Cm5vcm1pbmdfZXhjbHVzaW9uIDwtIG5vcm1pbmdfZGF0YSAlPiUgCiAgZmlsdGVyKGdlbmRlcj09ImZlbWFsZSIpICU+JSAKICBncm91cF9ieSh3b3JrZXJpZCkgJT4lCiAgc3VtbWFyaXplKGZlbWFsZV9tZWFuID0gbWVhbihlcXVhbGl6ZWRfcmVzcG9uc2UpKSAlPiUKICB1bmlxdWUoKSAlPiUgCiAgbXV0YXRlKGV4Y2x1c2lvbiA9IGZlbWFsZV9tZWFuIDwgbWVhbihmZW1hbGVfbWVhbikgLSAyKnNkKGZlbWFsZV9tZWFuKSkgJT4lCiAgZmlsdGVyKGV4Y2x1c2lvbj09VFJVRSkKYGBgCgpgYGB7ciBFQ0hPPVRSVUV9Cm5vcm1pbmdfZGF0YSA8LSBub3JtaW5nX2RhdGFbIShub3JtaW5nX2RhdGEkd29ya2VyaWQgJWluJSBub3JtaW5nX2V4Y2x1c2lvbiR3b3JrZXJpZCksXQpgYGAKCmBgYHtyfQpub3JtaW5nX21lYW5zIDwtIG5vcm1pbmdfZGF0YSAlPiUKICBmaWx0ZXIobmV1dHJhbF9tb3JoICE9Im1hbGVfYWRvcHRpb24iKSAlPiUKICBncm91cF9ieShvcnRob2csaWQpICU+JQogIHN1bW1hcmlzZShpbmRpX21lYW4gPSBtZWFuKGVxdWFsaXplZF9yZXNwb25zZSksIHRyaWFsX2NvdW50PW4oKSkgJT4lCiAgcmVuYW1lKGZvcm0gPSBvcnRob2cpICU+JQogIHJlbmFtZShsZXhlbWUgPWlkKQpgYGAKCmBgYHtyfQpub3JtaW5nX2Fkb3B0aW9ucyA8LSBub3JtaW5nX2RhdGEgJT4lCiAgZmlsdGVyKG5ldXRyYWxfbW9yaCA9PSAibWFsZV9hZG9wdGlvbiIpICU+JQogIGdyb3VwX2J5KG9ydGhvZykgJT4lCiAgc3VtbWFyaXNlKGluZGlfbWVhbiA9IG1lYW4oZXF1YWxpemVkX3Jlc3BvbnNlKSwgdHJpYWxfY291bnQ9bigpKSAlPiUKICBtdXRhdGUobGV4ZW1lID0gaWZlbHNlKG9ydGhvZz09ImFjdHJlc3MiLCJhY3RvciIsaWZlbHNlKG9ydGhvZz09ImhlaXJlc3MiLCJoZWlyIixpZmVsc2Uob3J0aG9nPT0iaGVyb2luZSIsImhlcm8iLGlmZWxzZShvcnRob2c9PSJob3N0ZXNzIiwiaG9zdCIsaWZlbHNlKG9ydGhvZz09Imh1bnRyZXNzIiwiaHVudGVyIixpZmVsc2Uob3J0aG9nPT0idmlsbGFpbmVzcyIsInZpbGxhaW4iLG9ydGhvZykpKSkpKSkgJT4lCiAgICByZW5hbWUoZm9ybSA9IG9ydGhvZykKYGBgCgpgYGB7cn0Kbm9ybWluZ19hZG9wdGlvbnMgPC0gbm9ybWluZ19hZG9wdGlvbnNbLCBjKCJsZXhlbWUiLCAiZm9ybSIsICJpbmRpX21lYW4iLCAidHJpYWxfY291bnQiKV0KYGBgCgpgYGB7cn0Kbm9ybWluZ19tZWFucyA8LSByYmluZChub3JtaW5nX21lYW5zLG5vcm1pbmdfYWRvcHRpb25zKSAlPiUKICByZW5hbWUobGV4ZW1lX25vcm0gPSBsZXhlbWUpCmBgYAoKYGBge3IgaW5jbHVkZT1GQUxTRX0KbGF0ZXJfY3JpdGljYWxzIDwtIGMoImFjdG9yIiwiYW5jaG9yIiwiYnVzaW5lc3NwZXJzb24iLCJjYW1lcmEgb3BlcmF0b3IiLCJjb25ncmVzc3BlcnNvbiIsImNyYWZ0c3BlcnNvbiIsImNyZXdtZW1iZXIiLCJmaXJlZmlnaHRlciIsImZsaWdodCBhdHRlbmRhbnQiLCJmb3JlcGVyc29uIiwiaGVpciIsImhlcm8iLCJob3N0IiwiaHVudGVyIiwibGF5cGVyc29uIiwibWV0ZW9yb2xvZ2lzdCIsInBvbGljZSBvZmZpY2VyIiwic2FsZXNwZXJzb24iLCJzdHVudCBkb3VibGUiLCJ2aWxsYWluIikKYGBgCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpub3JtaW5nX21lYW5zIDwtIG5vcm1pbmdfbWVhbnNbKG5vcm1pbmdfbWVhbnMkbGV4ZW1lX25vcm0gJWluJSBsYXRlcl9jcml0aWNhbHMpLF0KYGBgCgoqKk5ldXRyYWxzIE9ubHkqKgoKYGBge3J9Cm5vcm1pbmdfbWVhbnNfbmV1dHJhbCA8LSBub3JtaW5nX2RhdGEgJT4lCiAgZmlsdGVyKGdlbmRlcj09Im5ldXRyYWwiKSAlPiUKICBmaWx0ZXIobmV1dHJhbF9tb3JoICE9Im1hbGVfYWRvcHRpb24iKSAlPiUKICBncm91cF9ieShvcnRob2csaWQpICU+JQogIHN1bW1hcmlzZShpbmRpX21lYW4gPSBtZWFuKGVxdWFsaXplZF9yZXNwb25zZSksIHRyaWFsX2NvdW50PW4oKSkgJT4lCiAgcmVuYW1lKGZvcm0gPSBvcnRob2cpICU+JQogIHJlbmFtZShsZXhlbWUgPWlkKQpgYGAKCmBgYHtyfQpub3JtaW5nX2Fkb3B0aW9uc19uZXV0cmFsIDwtIG5vcm1pbmdfZGF0YSAlPiUKICBmaWx0ZXIoZ2VuZGVyPT0ibmV1dHJhbCIpICU+JQogIGZpbHRlcihuZXV0cmFsX21vcmggPT0gIm1hbGVfYWRvcHRpb24iKSAlPiUKICBncm91cF9ieShvcnRob2cpICU+JQogIHN1bW1hcmlzZShpbmRpX21lYW4gPSBtZWFuKGVxdWFsaXplZF9yZXNwb25zZSksIHRyaWFsX2NvdW50PW4oKSkgJT4lCiAgbXV0YXRlKGxleGVtZSA9IGlmZWxzZShvcnRob2c9PSJhY3RyZXNzIiwiYWN0b3IiLGlmZWxzZShvcnRob2c9PSJoZWlyZXNzIiwiaGVpciIsaWZlbHNlKG9ydGhvZz09Imhlcm9pbmUiLCJoZXJvIixpZmVsc2Uob3J0aG9nPT0iaG9zdGVzcyIsImhvc3QiLGlmZWxzZShvcnRob2c9PSJodW50cmVzcyIsImh1bnRlciIsaWZlbHNlKG9ydGhvZz09InZpbGxhaW5lc3MiLCJ2aWxsYWluIixvcnRob2cpKSkpKSkpICU+JQogICAgcmVuYW1lKGZvcm0gPSBvcnRob2cpCmBgYAoKYGBge3J9Cm5vcm1pbmdfYWRvcHRpb25zX25ldXRyYWwgPC0gbm9ybWluZ19hZG9wdGlvbnNfbmV1dHJhbFssIGMoImxleGVtZSIsICJmb3JtIiwgImluZGlfbWVhbiIsICJ0cmlhbF9jb3VudCIpXQpgYGAKCmBgYHtyfQpub3JtaW5nX21lYW5zX25ldXRyYWwgPC0gcmJpbmQobm9ybWluZ19tZWFuc19uZXV0cmFsLG5vcm1pbmdfYWRvcHRpb25zX25ldXRyYWwpCmBgYAoKYGBge3IgaW5jbHVkZT1GQUxTRX0Kbm9ybWluZ19tZWFuc19uZXV0cmFsIDwtIG5vcm1pbmdfbWVhbnNfbmV1dHJhbFsobm9ybWluZ19tZWFuc19uZXV0cmFsJGxleGVtZSAlaW4lIGxhdGVyX2NyaXRpY2FscyksXQpgYGAKCiMjIFNlbGYtUGFjZWQgUmVhZGluZyBTdHVkeQoKIyMjIE1ldGhvZHMKCioqUGFydGljaXBhbnRzKioKCldlIG9yaWdpbmFsbHkgcmFuIHRoZSBleHBlcmltZW50IG9uIDIwMCBwYXJ0aWNpcGFudHMsIHJlY3J1aXRlZCB0aHJvdWdoIHRoZSBvbmxpbmUgcGFydGljaXBhbnQgcmVjcnVpdG1lbnQgcGxhdGZvcm0gPGEgaHJlZj0iaHR0cHM6Ly93d3cucHJvbGlmaWMuY28iPlByb2xpZmljPC9hPi4gVGhlIG1lYW4gdGltZSBvZiB0aGUgZXhwZXJpbWVudCB3YXMgNS4zOSBtaW51dGVzLCBhbmQgcGFydGljaXBhbnRzIHdlcmUgcGFpZCAkMS43NSBmb3IgdGhlaXIgcGFydGljaXBhdGlvbl5bVGhpcyBhbW91bnRzIHRvIGFuIGhvdXJseSByYXRlIG9mIFwkMjAuNzMuIFdlIG9yaWdpbmFsbHkgYW50aWNpcGF0ZWQgdGhhdCBwYXJ0aWNpcGFudHMgd291bGQgdGFrZSBhbiBhdmVyYWdlIG9mIDcgbWludXRlcyB0byBjb21wbGV0ZSB0aGUgZXhwZXJpbWVudCwgYW5kIHNldCB0aGUgYmFzZSBwYXkgYXQgXCQxNSBhbiBob3VyLl0uIFRoZSBvbmx5IHJlc3RyaWN0aW9ucyBwbGFjZWQgb24gcGFydGljaXBhbnRzIHdlcmUgdGhhdCB0aGV5OgoKPG9sPgogIDxsaT5XZXJlIGJvcm4gaW4gdGhlIFVuaXRlZCBTdGF0ZXM8L2xpPgogIDxsaT5MaXZlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhdCB0aGUgdGltZSBvZiBwYXJ0aWNpcGF0aW9uPC9saT4KICA8bGk+U3Bva2UgRW5nbGlzaCBhcyBhIGZpcnN0IGxhbmd1YWdlPC9saT4KICA8bGk+SGFkIG5vdCBwYXJ0aWNpcGF0ZWQgaW4gdGhlIG5vcm1pbmcgc3R1ZHkgZm9yIHRoZSBzdGltdWxpPC9saT4KPC9vbD4KClRoZXNlIHJlcXVpcmVtZW50cyB3ZXJlIGltcGxlbWVudGVkIGluIG9yZGVyIHRvIGFzc3VyZSB0aGF0IHNwZWFrZXJzIGNhbWUgZnJvbSBhdCBsZWFzdCBzb21ld2hhdCBzaW1pbGFyIGxpbmd1aXN0aWMgYmFja2dyb3VuZHMsIGFzIGNlcnRhaW4gbGV4aWNhbCBpdGVtcyBpbiB0aGUgc3R1ZHkgKHN1Y2ggYXMgPGk+Y29uZ3Jlc3NwZXJzb248L2k+KSBhcmUgcXVpdGUgbG9jYWxpemVkIHRvIHRoZSBVbml0ZWQgU3RhdGVzLgoKQWZ0ZXIgdGhpcyBpbml0aWFsIHJ1biBvZiB0aGUgZXhwZXJpbWVudCwgd2UgZm91bmQgdGhhdCB0aGVyZSB3YXMgYSBkZWFydGggb2YgY29uc2VydmF0aXZlIG9yIFJlcHVibGljYW4tYWxpZ25lZCBwYXJ0aWNpcGFudHMuIEFzIGEgcmVzdWx0LCB3ZSByYW4gdGhlIGV4cGVyaW1lbnQgYWdhaW4sIHRoaXMgdGltZSBvbiA5OCBzZWxmLWlkZW50aWZpZWQgUmVwdWJsaWNhbnMuIFRoaXMgd2FzIGFjaGlldmVkIGJ5IGFkZGluZyBhIGZpbHRlciBvbiBQcm9saWZpYyBzbyB0aGF0IG9ubHkgUmVwdWJsaWNhbi1pZGVudGlmaWVkIGluZGl2aWR1YWxzIGNvdWxkIHNlZSB0aGUgdGFzay4gVGhlIHJlc3Qgb2YgdGhlIGV4cGVyaW1lbnQsIGluY2x1ZGluZyBwYXltZW50LCB3YXMgZXhhY3RseSB0aGUgc2FtZSwgZXhjZXB0IHRoYXQgYW4gYWRkaXRpb25hbCBkaXNjbGFpbWVyIHRoYXQgcGFydGljaXBhbnRzIGNvdWxkIG5vdCB1c2UgdGhlIEZpcmVGb3ggYnJvd3NlciBleHBlcmltZW50LCBhZnRlciB0aGUgZmlyc3QgcnVuIHJldmVhbGVkIGFuIGluY29tcGF0aWJpbGl0eSBiZXR3ZWVuIEphdmFTY3JpcHQgYW5kIEZpcmVGb3guIFRoZSB0d28gcnVucyBvZiB0aGUgZXhwZXJpbWVudCBhbW91bnRlZCBpbiBhIHRvdGFsIG9mIDI5OCBwYXJ0aWNpcGFudHMgd2hvIGNvbXBsZXRlZCB0aGUgdGFzay4KCiMjIyBBbmFseXNpcwoKKipSZWFkaW5nIGluIHRoZSBEYXRhKioKCmBgYHtyfQpzcHJ0X2RhdGEgPC0gcmVhZC5jc3YoJ3NwcnRfZGF0YS5jc3YnKSAlPiUKICBmaWx0ZXIodHJpYWxfaWQhPSAnZXhhbXBsZScpICU+JQogIGZpbHRlcihyZWdpb249PSdjcml0aWNhbCcpCmBgYAoKKipFeGNsdXNpb25zKiogCgpOb3csIHdlIHdhbnQgdG8gZXhjbHVkZSBhbnkgcGFydGljaXBhbnRzIHdobyBmYWlsZWQgdG8gYW5zd2VyIGF0IGxlYXN0IDg1JSBvZiB0aGUgYXR0ZW50aW9uIGNoZWNrIHF1ZXN0aW9ucyBjb3JyZWN0bHkuIFdlIGRvIHRoaXMgYnkgY3JlYXRpbmcgYSBsaXN0IG9mIGFsbCBwYXJ0aWNpcGFudHMgd2hvIHNjb3JlZCBsZXNzIHRoYW4gODUlIG9uIHRoZXNlIGNoZWNrcywgYW5kIHRoZW4gY3Jvc3MtcmVmZXJlbmNpbmcgdGhpcyBsaXN0IHdpdGggYWxsIGRhdGEgcG9pbnRzLCByZW1vdmluZyBhbnkgZGF0YSBwb2ludHMgd2hvc2UgcGFydGljaXBhbnRzIHdlcmUgaW4gdGhlIGV4Y2x1c2lvbiBsaXN0LiAKCmBgYHtyfQpzcHJ0X2V4Y2x1c2lvbiA8LSBzcHJ0X2RhdGEgJT4lIGdyb3VwX2J5KHdvcmtlcmlkKSAlPiUKICBzdW1tYXJpc2UoYWNjdXJhY3kgPSBtZWFuKHJlc3BvbnNlX2NvcnJlY3QpKSAlPiUKICBtdXRhdGUoZXhjbHVkZSA9IGlmZWxzZShhY2N1cmFjeSA8IDAuODUsJ1llcycsJ05vJykpICU+JSAKICBmaWx0ZXIoZXhjbHVkZSA9PSAnWWVzJykKCnNwcnRfZGF0YSA8LSBzcHJ0X2RhdGFbIShzcHJ0X2RhdGEkd29ya2VyaWQgJWluJSBzcHJ0X2V4Y2x1c2lvbiR3b3JrZXJpZCksXQpgYGAKCldlIGFsbCB3YW50IHRvIGZpbHRlciBvdXQgYWxsIHRyaWFscyBpbiB3aGljaCB0aGUgcmVhZGluZyB0aW1lIGZvciB0aGUgY3JpdGljYWwgaXRlbSB3YXMgbW9yZSB0aGFuIDIuNSBzdGFuZGFyZCBkZXZpYXRpb25zIGZyb20gdGhlIG1lYW4gcmVhZGluZyB0aW1lIG9uIHRoYXQgbGV4aWNhbCBpdGVtIGFjcm9zcyBhbGwgcGFydGljaXBhbnRzLiAKCmBgYHtyfQpzcHJ0X2RhdGEgPC0gc3BydF9kYXRhICU+JQogIGdyb3VwX2J5KHRyaWFsX2lkKSAlPiUKICBtdXRhdGUoaWRfbWVhbiA9IG1lYW4obG9nKHJ0KSkpICU+JQogIG11dGF0ZShleGNsdXNpb24gPSAobG9nKHJ0KSA8IG1lYW4obG9nKHJ0KSkgLSAyKnNkKGxvZyhydCkpfChsb2cocnQpID4gbWVhbihsb2cocnQpKSArIDIqc2QobG9nKHJ0KSkpKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGZpbHRlcihleGNsdXNpb249PUZBTFNFKQpgYGAKCmBgYHtyfQpzcHJfZGF0YSA8LSBzcHJfZGF0YSAlPiUKICBmaWx0ZXIoIWlzLm5hKHN1YmplY3RfaW5mb3JtYXRpb24uYWdlKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShzdWJqZWN0X2luZm9ybWF0aW9uLnBvbGlfcGFydHkpKQpgYGAKCgpUaGlzIHJlc3VsdHMgaW4gMjM4IHRyaWFscyBiZWluZyByZW1vdmVkIGZyb20gdGhlIDU1ODAgd2UgZ290IGFmdGVyIHRoZSBieS1wYXJ0aWNpcGFudCBleGNsdXNpb25zLiBXZSBub3cgaGF2ZSA1MzQyIHRyaWFscyB3ZSBjYW4gdXNlIGZvciBhbmFseXNpcy4KCioqQWRkaXRpb25hbCBJbmZvcm1hdGlvbioqCk5vdyB0aGF0IHdlIGhhdmUgb25seSB0aGUgcm93cyB3ZSB3YW50LCBsZXQncyBhZGQgc29tZSBuZXcgY29sdW1ucywgd2hpY2ggd2lsbCBjb250YWluIGltcG9ydGFudCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBkYXRhIHBvaW50LiBIZXJlLCB3ZSB3aWxsIGJlIGFkZGluZzoKCi0gR2VuZGVyIElkZW9sb2d5IFN1YnNjb3JlcwotIFRyaWFsIEdlbmRlcnMKLSBUcmlhbCBNb3JwaG9sb2d5IFR5cGVzCi0gQ3JpdGljYWwgSXRlbSBMZW5ndGggJiBMZW5ndGgtQ29udHJvbGxlZCBSZXNpZHVhbHMKLSBUcmlhbCBDb25ncnVlbmN5IAotIFBhcnRpcGFudCBQb2xpdGljYWwgQWZmaWxpYXRpb24KCklkZWFsbHksIEkgd291bGQndmUgYWRkZWQgYWxsIG9mIHRoZXNlIGJ1dCB0aGUgZmlyc3Qgd2hlbiBJIGFjdHVhbGx5IGNyZWF0ZWQgdGhlIHN0aW11bGkgYW5kIGxvZ2dlZCByZXNwb25zZXMsIGJ1dCBJIGZvcmdvdCB0byEgTHVja2lseSwgUiBhbGxvd3MgdXMgdG8gZG8gdGhpcyBwb3N0LWhvYyBmYWlybHkgc3RyYWlnaHRmb3J3YXJkbHkuLi4gd2hpY2ggaXMgZ29vZCwgc2luY2UgdGhlc2UgZmVhdHVyZXMgd2lsbCBiZSBjcml0aWNhbCBpbiBvdXIgZGF0YSB2aXN1YWxpemF0aW9uIGFuZCBhbmFseXNpcy48YnI+Cjxicj4KCjxicj4KVGhlIHF1ZXN0aW9uIHVuZGVyIGludmVzdGlnYXRpb24gaGVyZSBpcyB3aGV0aGVyIG9yIG5vdCBpbmRpdmlkdWFscycgY29uY2VwdGlvbnMgb2YgZ2VuZGVyIGFmZmVjdCBob3cgdGhleSBwcm9jZXNzICBnZW5kZXJlZCBhbmQgZ2VuZGVyLW5ldXRyYWwgZm9ybXMgb2YgRW5nbGlzaCBwZXJzb25hbCBhbmQgcHJvZmVzc2lvbmFsIHRpdGxlcy4gPGJyPgo8YnI+CkluIG9yZGVyIHRvIGV4YW1pbmUgdGhpcywgd2UgbmVlZCB0byBxdWFuaWZ5IHBhcnRpY2lwYW50cycgaWRlb2xvZ2ljYWwgdmlld3MhIEhlcmUgd2UgaGF2ZSBhZG9wdGVkIHRoZSAxMy1pdGVtIFNvY2lhbCBSb2xlcyBRdWVzdGlvbm5haXJlIHB1dCBmb3J0aCBpbiBCYWJlciAmIFR1Y2tlciAoMjAwNikuIFF1ZXN0aW9ucyAxLTUgY29ycmVsYXRlIHRvIHRoZSA8aT4nR2VuZGVyIFRyYW5zY2VuZGVudCc8L2k+IHN1YnNjYWxlLCBhbmQgcXVlc3Rpb25zIDYtMTMgY29ycmVzcG9uZCB0byB0aGUgPGk+J0dlbmRlciBMaW5rZWQnPC9pPiBzdWJzY2FsZS4gRWFjaCBpdGVtIGlzIHNjb3JlZCBvbiBhIHNjYWxlIG9mIDAtMTAwLiBTbywgdGhlIGZpcnN0IHRoaW5nIHdlIHdhbnQgdG8gZG8gaXMgbWFrZSB0d28gbGlzdHMgb2YgY29sdW1ucyB3aGljaCBjb3JyZXNwb25kIHRvIHRoZXNlIHR3byBzdWJzY2FsZXMsIHNpbmNlIHRoZSBxdWVzdGlvbnMgYXJlIHN0b3JlZCBpbmRpdmlkdWFsbHkgaW4gdGhlIGRhdGE6CgpgYGB7cn0KZ2VuZGVyX3RyYW5zY2VuZGVuY2VfY29scyA8LSBjKCdzdWJqZWN0X2luZm9ybWF0aW9uLmdlbmRlcl9xMScsJ3N1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyX3EyJywnc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXJfcTMnLCdzdWJqZWN0X2luZm9ybWF0aW9uLmdlbmRlcl9xNCcsJ3N1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyX3E1JykKCmdlbmRlcl9saW5rZWRfY29scyA8LSBjKCdzdWJqZWN0X2luZm9ybWF0aW9uLmdlbmRlcl9xNicsJ3N1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyX3E3Jywnc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXJfcTgnLCdzdWJqZWN0X2luZm9ybWF0aW9uLmdlbmRlcl9xOScsJ3N1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyX3ExMCcsJ3N1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyX3ExMScsJ3N1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyX3ExMicsJ3N1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyX3ExMycpCmBgYAo8YnI+Ck5vdyB3ZSBjYW4gdXNlIHRoZSBtdXRhdGUoKSBtZXRob2Qgb24gPGI+c3BydF9kYXRhPC9iPiB0byBhZGQgdHdvIG5ldyBjb2x1bW5zLCBvbmUgZm9yIGVhY2ggc3Vic2NhbGUuIFdlIHRlbGwgUiB0byB0YWtlIHRoZSBtZWFucyBvZiB0aGUgc3BlY2lmaWVkIGNvbHVtbnMgaW4gW2NvbHVtbl9uYW1lc10gb2YgPGI+c3BydF9kYXRhPC9iPiBmb3IgZWFjaCBpbmRpdmlkdWFsIHJvdzogcm93TWVhbnMoc3BydF9kYXRhW2NvbHVtbl9uYW1lc10pLiBXZSBhbHNvIGhhdmUgdG8gc3VidHJhY3QgdGhpcyBtZWFuIGZyb20gMTAwIGluIHRoZSBjYXNlIG9mIHRoZSA8aT4nR2VuZGVyIFRyYW5zY2VuZGVudCc8L2k+IHN1YnNjYWxlLCBzaW5jZSBpdCBpcyBpbnZlcnNlbHkgc2NvcmVkLiBGaW5hbGx5LCB3ZSBjYW4gY3JlYXRlIGFuIGF2ZXJhZ2UgdG90YWwgc2NvcmUgcmVnYXJkbGVzcyBvZiBzdWJzY29yZXMsIHNpbXBseSBieSBtZWFuaW5nIHRoZSB0d28gc3Vic2NvcmVzIHdlIGFscmVhZHkgaGF2ZS4KCmBgYHtyfQpzcHJ0X2RhdGEgPC0gc3BydF9kYXRhICU+JQogIG11dGF0ZShnZW5kZXJfdHJhbnMgPSAxMDAgLSAocm93TWVhbnMoc3BydF9kYXRhW2dlbmRlcl90cmFuc2NlbmRlbmNlX2NvbHNdKSkpICU+JQogIG11dGF0ZShnZW5kZXJfbGluayA9IHJvd01lYW5zKHNwcnRfZGF0YVtnZW5kZXJfbGlua2VkX2NvbHNdKSkgCgpnZW5kZXJfYWxsID0gYygnZ2VuZGVyX3RyYW5zJywnZ2VuZGVyX2xpbmsnKQoKc3BydF9kYXRhIDwtIHNwcnRfZGF0YSAlPiUKICBtdXRhdGUoZ2VuZGVyX3RvdGFsID0gcm93TWVhbnMoc3BydF9kYXRhW2dlbmRlcl9hbGxdKSkKYGBgCgo8YnI+CldlIGFsc28gd2FudCB0byBhZGQgd2hldGhlciB0aGUgdHJpYWwgaW5jbHVkZWQgYSBmZW1hbGUgb3IgbWFsZSByZWZlcmVudCAoYnV0IGFsc28sIGxpa2UsIGRlc3Ryb3kgdGhlIGJpbmFyeSEpLiBJbiBvcmRlciB0byBkbyB0aGlzLCB3ZSdsbCBqdXN0IGFkZCBhIDxiPnRyaWFsX2dlbmRlcjwvYj4gY29sdW1uIHRoYXQgc2F5cyA8aT4nZmVtYWxlJzwvaT4gaWYgdGhlIGNvbmRpdGlvbiB3YXMgZWl0aGVyIDxpPiduZXV0cmFsX2ZlbWFsZSc8L2k+IG9yIDxpPidjb25ncnVlbnRfZmVtYWxlJzwvaT4uIE90aGVyd2lzZSwgd2Ugd2FudCB0aGUgPGI+dHJpYWxfZ2VuZGVyPC9iPiB0byBzYXkgPGk+J21hbGUnPC9pPi4KCmBgYHtyfQpzcHJ0X2RhdGEgPC0gc3BydF9kYXRhICU+JQogIG11dGF0ZSh0cmlhbF9nZW5kZXIgPSBpZmVsc2UoY29uZGl0aW9uPT0nbmV1dHJhbF9mZW1hbGUnIHwgY29uZGl0aW9uID09ICdjb25ncnVlbnRfZmVtYWxlJywnZmVtYWxlJywnbWFsZScpKSAKCnNwcnRfZGF0YSAlPiUKICBzZWxlY3Qod29ya2VyaWQscnQsY29uZGl0aW9uLHRyaWFsX2lkLHRyaWFsX2dlbmRlcikKYGBgCgo8YnI+Ck5vdyB3ZSB3YW50IHRvIGFkZCB3aGV0aGVyIG9yIG5vdCB0aGUgbGV4ZW1lJ3MgbmV1dHJhbCBmb3JtIGlzIGRldmVsb3BlZCBieSBjb21wb3VuZGluZyAoYXMgaW4gPGk+J2NvbmdyZXNzLXBlcnNvbic8L2k+KSBvciBieSB0aGUgYWRvcHRpb24gb2YgdGhlIG1hbGUgZm9ybSAoYXMgaW4gPGk+J2FjdG9yJzwvaT4gYmVpbmcgdXNlZCBtb3JlIGZvciBib3RoIG1lbiBhbmQgd29tZW4pLiBJbiB0aGlzIHN0dWR5LCB3ZSBvbmx5IGhhdmUgc2l4IGxleGVtZXMgb2YgdGhlIGxhdHRlciB0eXBlLCBzbyB3ZSdsbCBqdXN0IHRlbGwgUiB0byBhc3NpZ24gdGhvc2UgYSA8Yj5tb3JwaF90eXBlPC9iPiB2YWx1ZSBvZiA8aT4nYWRvcHRpb24nPC9pPiAoZm9yICdtYWxlIGFkb3B0aW9uJyksIGFuZCBhbGwgZWxzZSB3aWxsIGJlIGFzc2lnbmVkIGEgdmFsdWUgb2YgPGk+J2NvbXBvdW5kJzwvaT4uCgpgYGB7cn0Kc3BydF9kYXRhIDwtIHNwcnRfZGF0YSU+JQogIG11dGF0ZShtb3JwaF90eXBlID0gaWZlbHNlKGxleGVtZSE9ICdhY3RvcicgJiBsZXhlbWUhPSAnaG9zdCcgJiBsZXhlbWUgIT0naHVudGVyJyAmIGxleGVtZSE9ICd2aWxsYWluJyAmIGxleGVtZSE9ICdoZWlyJyAmIGxleGVtZSE9ICdoZXJvJywnY29tcG91bmQnLCdhZG9wdGlvbicpKQoKc3BydF9kYXRhICU+JQogIHNlbGVjdChydCxsZXhlbWUsbW9ycGhfdHlwZSkKYGBgCgoKPGJyPgpBbm90aGVyIGltcG9ydGFudCBmYWN0b3Igd2Ugd2FudCB0byBleHBsb3JlIGlzIHRoZSBsZW5ndGggb2YgdGhlIGNyaXRpY2FsIGl0ZW0hIEluIG9yZGVyIHRvIGFkZCB0aGlzLCB3ZSBzaW1wbHkgY3JlYXRlIGEgbmV3IGNvbHVtbiA8Yj5mb3JtX2xlbmd0aDwvYj4gYW5kIHRlbGwgUiB0byBpbnB1dCBhcyB0aGF0IGNvbHVtbidzIHZhbHVlIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0aGF0IGFwcGVhcnMgaW4gdGhhdCByb3cncyA8Yj5mb3JtPC9iPiBjb2x1bW4sIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBvcnRob2dyYXBpYyBmb3JtIG9mIHRoZSBjcml0aWNhbCBpdGVtIGluIHRoYXQgdHJpYWwuIDxpPk5vdGUgdGhhdCB0aGlzIHdpbGwgaW5jbHVkZSBzcGFjZXMgaW4gdGhlIGNvdW50ITwvaT4KCmBgYHtyfQpzcHJ0X2RhdGEgPC0gc3BydF9kYXRhICU+JQogIG11dGF0ZShmb3JtX2xlbmd0aCA9IHN0cl9sZW5ndGgoZm9ybSkpCgpzcHJ0X3Jlc2lkdWFsX21vZGVsIDwtIGxtKGxvZyhydCl+Zm9ybV9sZW5ndGgsIGRhdGEgPSBzcHJ0X2RhdGEpCgpzcHJ0X2RhdGEgPC0gc3BydF9kYXRhICU+JQogIG11dGF0ZShyZXNpZF9ydCA9IHJlc2lkKHNwcnRfcmVzaWR1YWxfbW9kZWwpKQpgYGAKCk5vdyB0aGF0IHdlIGhhdmUgdGhlc2UsIHdlIGNhbiBydW4gYSBzaW1wbGUgbGluZWFyIHJlZ3Jlc3Npb24gd2hpY2ggd2lsbCBzaG93IHVzIHRoZSBlZmZlY3Qgb2Ygb3J0aG9ncmFwaGljIGxlbmd0aCBvbiByZWFkaW5nIHRpbWUuIFRoZW4gd2UgYWRkIGEgbmV3IGNvbHVtbiBpbiB0aGUgZGF0YSB3aGljaCBpcyB0aGUgcmVzaWR1YWwgcmVhZGluZyB0aW1lLCBvciB0aGUgcmVhZGluZyB0aW1lIGluIGxvZyBzcGFjZSBBRlRFUiB3ZSBjb250cm9sIGZvciB0aGUgZWZmZWN0cyBvZiBvcnRob2dyYXBoaWMgbGVuZ3RoLgoKPGJyPgpXZSBhbHNvIHdhbnQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYSBjb2x1bW4gd2hpY2ggcmVjb3JkcyB3aGV0aGVyIG9yIG5vdCB0aGUgdHJpYWwgd2FzIGdlbmRlci1jb25ncnVlbnQgKGFzIGluIDxpPidTaGVsYnkgaXMgYSBjb25ncmVzc3dvbWFuJzwvaT4pIG9yIGdlbmRlciBuZXV0cmFsIChhcyBpbiA8aT4nU2hlbGJ5IGlzIGEgY29uZ3Jlc3NwZXJzb24nPC9pPikuIFdlIGFkZCBhIDxiPnRyaWFsX2NvbmdydWVuY3k8L2I+IGNvbHVtbiwgd2hpY2ggaXMgdmFsdWVkIGFzIDxpPidjb25ncnVlbnQnPC9pPiBpZiB0aGF0IHJvdydzIGNvbmRpdGlvbiBpcyBvbmUgb2YgdGhlIHR3byBjb25ncnVlbnQgY29uZGl0aW9ucy4gT3RoZXJ3aXNlLCBpdCBnZXRzIHZhbHVlZCBhcyA8aT4nbmV1dHJhbCc8L2k+LgoKYGBge3J9CnNwcnRfZGF0YSA8LSBzcHJ0X2RhdGEgJT4lCiAgbXV0YXRlKHRyaWFsX2NvbmdydWVuY3kgPSBpZmVsc2UoY29uZGl0aW9uPT0nY29uZ3J1ZW50X21hbGUnIHwgY29uZGl0aW9uID09ICdjb25ncnVlbnRfZmVtYWxlJywnY29uZ3J1ZW50JywnbmV1dHJhbCcpKQpgYGAKCjxicj4KRmluYWxseSwgd2UgY2FuIGNsYXNzaWZ5IHBhcnRpY2lwYW50cyBieSB0aGVpciBwYXJ0aWN1bGFyIHBvbGl0aWNhbCBhbGlnbm1lbnQ7IHdlIGNhbiBjb25zdHJ1ZSB0aGlzIGJyb2FkbHkgYXMgIlJlcHVibGljYW5zIiB2cy4gIkRlbW9jcmF0cyIsIHdpdGggdGhvc2Ugd2hvIGRlY2xpbmVkIHRvIHN0YXRlIGEgcHJlZmVyZW5jZSwgb3IgcGxhY2VkIHRoZW1zZWx2ZXMgaW4gdGhlIG1pZGRsZSwgYXMgIk5vbi1QYXJ0aXNhbiIuCgpgYGB7cn0Kc3BydF9kYXRhIDwtIHNwcnRfZGF0YSAlPiUKICBtdXRhdGUocG9saV9wYXJ0eSA9IGlmZWxzZShzdWJqZWN0X2luZm9ybWF0aW9uLnBhcnR5X2FsaWdubWVudCA9PSAxIHwgc3ViamVjdF9pbmZvcm1hdGlvbi5wYXJ0eV9hbGlnbm1lbnQgPT0gMiwnUmVwdWJsaWNhbicsaWZlbHNlKHN1YmplY3RfaW5mb3JtYXRpb24ucGFydHlfYWxpZ25tZW50ID09IDQgfCBzdWJqZWN0X2luZm9ybWF0aW9uLnBhcnR5X2FsaWdubWVudCA9PSA1LCdEZW1vY3JhdCcsJ05vbi1QYXJ0aXNhbicpKSkKYGBgCgoqKkpvaW5pbmcgaW5kZXBlbmRlbnQgZGF0YSoqCk5vdyB0aGF0IHdlIGhhdmUgdGhpcyBpbmZvcm1hdGlvbiwgd2Ugd2FudCB0byBsZWZ0IGpvaW4gb3VyIGZyZXF1ZW5jeSBpbmZvcm1hdGlvbiBzbyB0aGF0IHdlIGNhbiB1c2UgaXQgaW4gbGF0ZXIgYW5hbHlzZXMuIFdlIGJlZ2luIGJ5IGFkZGluZyB0aGUgbm9ybWluZyB2YWx1ZXMnIG1lYW5zLCBvZiBhbGwgZm9ybXMuCgpgYGB7cn0KZmluYWxfc3ByIDwtIGxlZnRfam9pbihzcHJ0X2RhdGEsbm9ybWluZ19tZWFucyxieT0iZm9ybSIpCmBgYAoKTm93IHdlIGNhbiBhZGQgdGhlIGZyZXF1ZW5jeSBkYXRhIGFzIHdlbGwsIGJ5IGZvcm0uIAoKYGBge3J9CmZpbmFsX3NwciA8LSBsZWZ0X2pvaW4oZmluYWxfc3ByLGZyZXF1ZW5jeSxieT0iZm9ybSIpCmBgYAoKTm93IHdlIGNhbiBhZGQgYWRkaXRpb25hbCBsZXhlbWUtbGV2ZWwgbm9ybWluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG5ldXRyYWwgZm9ybXMsIHNvIHRoYXQgd2UgY2FuIHRhY2tsZSB0aGUgcXVlc3Rpb24gb2Ygd2hhdCByb2xlIHJlYWwtd29ybGQgZXhwZWN0YXRpb25zIGhhdmUgb24gcHJvY2Vzc2luZyB0aW1lcy4gCgpgYGB7cn0KZmluYWxfc3ByIDwtIGxlZnRfam9pbihmaW5hbF9zcHIsbm9ybWluZ19tZWFuc19uZXV0cmFsLGJ5PSJsZXhlbWUiKQpgYGAKCmBgYHtyfQpmaW5hbF9zcHIgPC0gc3Vic2V0KGZpbmFsX3Nwciwgc2VsZWN0ID0gLWMoZm9ybS55LHRyaWFsX2NvdW50LnksdHJpYWxfY291bnQueCxlcnJvcixzdWJqZWN0X2luZm9ybWF0aW9uLmNvbW1lbnRzLHN1YmplY3RfaW5mb3JtYXRpb24uYXNzZXMsc3ViamVjdF9pbmZvcm1hdGlvbi5lbmpveW1lbnQsc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXJfcTEsc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXJfcTIsc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXJfcTMsc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXJfcTQsc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXJfcTUsc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXJfcTYsc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXJfcTcsc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXJfcTgsc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXJfcTksc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXJfcTEwLHN1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyX3ExMSxzdWJqZWN0X2luZm9ybWF0aW9uLmdlbmRlcl9xMTIsc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXJfcTEzLGxleGVtZV9ub3JtKSkgJT4lCiAgcmVuYW1lKGZvcm1fbm9ybSA9IGluZGlfbWVhbi54LCBsZXhlbWVfbm9ybSA9IGluZGlfbWVhbi55LCBmb3JtID0gZm9ybS54KSAlPiUKICBtdXRhdGUoeW91bmdfb2xkID0gaWZlbHNlKHN1YmplY3RfaW5mb3JtYXRpb24uYWdlID4gNDAsIm9sZCIsInlvdW5nIikpICU+JSAKICBtdXRhdGUobWVkaWFfc291cmNlID0gaWZlbHNlKHBvbGlfcGFydHkgPT0gIlJlcHVibGljYW4iLGxvZ19yaWdodCxpZmVsc2UocG9saV9wYXJ0eSA9PSAiRGVtb2NyYXQiLGxvZ19sZWZ0LGxvZ19hbGwpKSkgCmBgYAoKCiMjIyBGcmVxdWVuY2llcwoKYGBge3J9CmZyZXF1ZW5jeSAlPiUKICBnZ3Bsb3QoYWVzKHg9bWVhbl9mcmVxX2xlZnQseT1tZWFuX2ZyZXFfcmlnaHQsIGxhYmVsPWZvcm0pKSArIAogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV90ZXh0KCkgKyAKICBnZW9tX2FibGluZShpbnRlcmNlcHQ9MCxzbG9wZT0xLGNvbG9yPSJncmF5NjAiKSArCiAgY29vcmRfZml4ZWQoeGxpbT1jKDAsMjUwKSkKYGBgCgpgYGB7cn0KZnJlcXVlbmN5ICU+JQogIGZpbHRlcihtZWFuX2ZyZXFfcmlnaHQgPCA1MCkgJT4lIAogIGdncGxvdChhZXMoeD1tZWFuX2ZyZXFfbGVmdCx5PW1lYW5fZnJlcV9yaWdodCwgbGFiZWw9Zm9ybSkpICsgCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3RleHQoKSArIAogIGdlb21fYWJsaW5lKGludGVyY2VwdD0wLHNsb3BlPTEsY29sb3I9ImdyYXk2MCIpIApgYGAKCmBgYHtyfQpmcmVxdWVuY3kgJT4lCiAgZ2dwbG90KGFlcyh4PWxvZ19sZWZ0LHk9bG9nX3JpZ2h0LCBsYWJlbD1mb3JtKSkgKyAKICBnZW9tX3BvaW50KCkgKwogIGdlb21fdGV4dChzaXplPTQsbnVkZ2VfeT0uNSkgKyAKICBnZW9tX2FibGluZShpbnRlcmNlcHQ9MCxzbG9wZT0xLGNvbG9yPSJncmF5NjAiKSAKYGBgCgpgYGB7cn0KdHJhbnNmZXJfZGF0YSA8LSBmaW5hbF9zcHIgJT4lCiAgc2VsZWN0KGZvcm0sdHJpYWxfZ2VuZGVyKSAlPiUKICB1bmlxdWUoKQpgYGAKCmBgYHtyfQp0ZW1wIDwtIGxlZnRfam9pbihmcmVxdWVuY3ksdHJhbnNmZXJfZGF0YSwgYnk9ImZvcm0iKQpgYGAKCmBgYHtyfQp0ZW1wIDwtIHRlbXAgJT4lCiAgbXV0YXRlKGZvcm0gPSBmY3RfcmVvcmRlcihhcy5mYWN0b3IoZm9ybSksbWVkaWFfZGlmZikpICU+JQogICBtdXRhdGUobW9ycGhfdHlwZSA9IGlmZWxzZShmb3JtIT0gJ2FjdG9yJyAmIGZvcm0hPSAnaG9zdCcgJiBmb3JtICE9J2h1bnRlcicgJiBmb3JtIT0gJ3ZpbGxhaW4nICYgZm9ybSE9ICdoZWlyJyAmIGZvcm0hPSAnaGVybycgJiBmb3JtIT0gImFjdHJlc3MiICYgZm9ybSE9ICJob3N0ZXNzIiAmIGZvcm0hPSAiaHVudHJlc3MiICYgZm9ybSE9ICJ2aWxsYWluZXNzIiAmIGZvcm0hPSAiaGVpcmVzcyIgJiBmb3JtIT0gImhlcm9pbmUiLCdjb21wb3VuZCcsJ2Fkb3B0aW9uJykpICU+JQogIG11dGF0ZShnZW5kZXIgPSBpZmVsc2UoZm9ybT09ICdhbmNob3InIHwgZm9ybT09ICdidXNpbmVzc3BlcnNvbid8IGZvcm09PSAnY2FtZXJhIG9wZXJhdG9yJyB8IGZvcm09PSAnY29uZ3Jlc3NwZXJzb24nfCBmb3JtPT0gJ2NyYWZ0c3BlcnNvbid8IGZvcm09PSAnY3Jld21lbWJlcid8IGZvcm09PSAnZmlyZWZpZ2h0ZXInfCBmb3JtPT0gJ2ZsaWdodCBhdHRlbmRhbnQnfCBmb3JtPT0gJ2ZvcmVwZXJzb24nfCBmb3JtPT0gJ2xheXBlcnNvbid8IGZvcm09PSAnbWV0ZW9yb2xvZ2lzdCd8IGZvcm09PSAncG9saWNlIG9mZmljZXInfCBmb3JtPT0gJ3NhbGVzcGVyc29uJ3wgZm9ybT09ICdzdHVudCBkb3VibGUnLCduZXV0cmFsJywnZ2VuZGVyZWQnKSkgJT4lCiAgbXV0YXRlKGdlbmRlciA9IGlmZWxzZShnZW5kZXIgPT0gImdlbmRlcmVkIixhcy5jaGFyYWN0ZXIodHJpYWxfZ2VuZGVyKSxnZW5kZXIpKSAlPiUKICBmaWx0ZXIoISh0cmlhbF9nZW5kZXIgPT0gImZlbWFsZSIgJiBnZW5kZXI9PSJuZXV0cmFsIikpICU+JQogIGZpbHRlcighKGZvcm09PSJhY3RvciIgJiBnZW5kZXI9PSJmZW1hbGUiIHwgKGZvcm09PSJoZWlyIiAmIGdlbmRlcj09ImZlbWFsZSIpfCAoZm9ybT09Imhlcm8iICYgZ2VuZGVyPT0iZmVtYWxlIil8IChmb3JtPT0iaHVudGVyIiAmIGdlbmRlcj09ImZlbWFsZSIpfCAoZm9ybT09ImhlaXIiICYgZ2VuZGVyPT0iZmVtYWxlIil8IChmb3JtPT0iaG9zdCIgJiBnZW5kZXI9PSJmZW1hbGUiKXwgKGZvcm09PSJ2aWxsYWluIiAmIGdlbmRlcj09ImZlbWFsZSIpKSkKYGBgCgpgYGB7cn0KdGVtcCAlPiUKICBnZ3Bsb3QoYWVzKHg9Zm9ybSwgeT1tZWRpYV9kaWZmLCBmaWxsPWdlbmRlcixhbHBoYT1tb3JwaF90eXBlKSkgKyAKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKyAKICBzY2FsZV9hbHBoYV9kaXNjcmV0ZShyYW5nZSA9IGMoMC41LDEpKQpgYGAKCgpgYGB7cn0KZmluYWxfc3ByICU+JQogIGdncGxvdChhZXMoeD1sb2dfYWxsLCB5PXJlc2lkX3J0LCBjb2xvcj10cmlhbF9nZW5kZXIsIGxpbmV0eXBlPXRyaWFsX2NvbmdydWVuY3kpKSArIAogIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKCkKYGBgCgpgYGB7cn0KZmluYWxfc3ByICU+JQogIGdyb3VwX2J5KGZvcm0sdHJpYWxfY29uZ3J1ZW5jeSx0cmlhbF9nZW5kZXIpICU+JQogIG11dGF0ZShyZXNpZF9ydF9tZWFuID0gbWVhbihyZXNpZF9ydCkpICU+JQogIGdncGxvdChhZXMoeD1sb2dfYWxsLHk9cmVzaWRfcnRfbWVhbixjb2xvcj10cmlhbF9nZW5kZXIsbGluZXR5cGU9dHJpYWxfY29uZ3J1ZW5jeSkpICsKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikKYGBgCgpgYGB7cn0KZmluYWxfc3ByICU+JQogIGdyb3VwX2J5KGZvcm0sdHJpYWxfY29uZ3J1ZW5jeSx0cmlhbF9nZW5kZXIsbW9ycGhfdHlwZSkgJT4lCiAgbXV0YXRlKHJlc2lkX3J0X21lYW4gPSBtZWFuKHJlc2lkX3J0KSkgJT4lCiAgZmlsdGVyKGxvZ19hbGwgPiAtNSkgJT4lCiAgZ2dwbG90KGFlcyh4PWxvZ19hbGwseT1yZXNpZF9ydF9tZWFuLGNvbG9yPXRyaWFsX2dlbmRlcixsaW5ldHlwZT10cmlhbF9jb25ncnVlbmN5LGxhYmVsPWZvcm0sc2hhcGU9dHJpYWxfY29uZ3J1ZW5jeSkpICsKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgKyAKICBnZW9tX3RleHQoc2l6ZT00LG51ZGdlX3kgPS4wMykKYGBgCgpgYGB7cn0KZmluYWxfc3ByICU+JQogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIGdyb3VwX2J5KGZvcm0sdHJpYWxfY29uZ3J1ZW5jeSx0cmlhbF9nZW5kZXIsbW9ycGhfdHlwZSxwb2xpX3BhcnR5KSAlPiUKICBtdXRhdGUocmVzaWRfcnRfbWVhbiA9IG1lYW4ocmVzaWRfcnQpKSAlPiUKICBmaWx0ZXIobG9nX2FsbCA+IC01KSAlPiUKICBnZ3Bsb3QoYWVzKHg9bG9nX2FsbCx5PXJlc2lkX3J0X21lYW4sY29sb3I9dHJpYWxfZ2VuZGVyLGxpbmV0eXBlPXRyaWFsX2NvbmdydWVuY3ksbGFiZWw9Zm9ybSxzaGFwZT10cmlhbF9jb25ncnVlbmN5KSkgKwogIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iKSArIAogIGdlb21fdGV4dChzaXplPTIsbnVkZ2VfeSA9LjAzKSArIAogIGZhY2V0X3dyYXAofnBvbGlfcGFydHkpCmBgYAoKCioqbG9nX2xlZnQsIGRlbW9jcmF0cyoqCgoKYGBge3J9CmZpbmFsX3NwciAlPiUKICBmaWx0ZXIocG9saV9wYXJ0eSA9PSAiRGVtb2NyYXQiKSAlPiUKICBncm91cF9ieShmb3JtLHRyaWFsX2NvbmdydWVuY3ksdHJpYWxfZ2VuZGVyLG1vcnBoX3R5cGUpICU+JQogIG11dGF0ZShyZXNpZF9ydF9tZWFuID0gbWVhbihyZXNpZF9ydCkpICU+JQogIGZpbHRlcihsb2dfbGVmdCA+IC01KSAlPiUKICBnZ3Bsb3QoYWVzKHg9bG9nX2xlZnQseT1yZXNpZF9ydF9tZWFuLGxhYmVsPWZvcm0pKSArCiAgZ2VvbV9wb2ludCgpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsgCiAgZ2VvbV90ZXh0KHNpemU9NCxudWRnZV95ID0uMDMpCmBgYAoKYGBge3J9CmZpbmFsX3NwciAlPiUKICBmaWx0ZXIocG9saV9wYXJ0eSA9PSAiRGVtb2NyYXQiKSAlPiUKICBncm91cF9ieShmb3JtLHRyaWFsX2NvbmdydWVuY3ksdHJpYWxfZ2VuZGVyLG1vcnBoX3R5cGUpICU+JQogIG11dGF0ZShyZXNpZF9ydF9tZWFuID0gbWVhbihyZXNpZF9ydCkpICU+JQogIGZpbHRlcihsb2dfbGVmdCA+IC01KSAlPiUKICBnZ3Bsb3QoYWVzKHg9bG9nX2xlZnQseT1yZXNpZF9ydF9tZWFuLGNvbG9yPXRyaWFsX2dlbmRlcixsaW5ldHlwZT10cmlhbF9jb25ncnVlbmN5LGxhYmVsPWZvcm0sc2hhcGU9dHJpYWxfY29uZ3J1ZW5jeSkpICsKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgKyAKICBnZW9tX3RleHQoc2l6ZT00LG51ZGdlX3kgPS4wMykKYGBgCgoqKmxvZ19hbGwsIGRlbW9jcmF0cyoqCgpgYGB7cn0KZmluYWxfc3ByICU+JQogIGZpbHRlcihwb2xpX3BhcnR5ID09ICJEZW1vY3JhdCIpICU+JQogIGdyb3VwX2J5KGZvcm0sdHJpYWxfY29uZ3J1ZW5jeSx0cmlhbF9nZW5kZXIsbW9ycGhfdHlwZSkgJT4lCiAgbXV0YXRlKHJlc2lkX3J0X21lYW4gPSBtZWFuKHJlc2lkX3J0KSkgJT4lCiAgZmlsdGVyKGxvZ19sZWZ0ID4gLTUpICU+JQogIGdncGxvdChhZXMoeD1sb2dfYWxsLHk9cmVzaWRfcnRfbWVhbixjb2xvcj10cmlhbF9nZW5kZXIsbGluZXR5cGU9dHJpYWxfY29uZ3J1ZW5jeSxsYWJlbD1mb3JtLHNoYXBlPXRyaWFsX2NvbmdydWVuY3kpKSArCiAgZ2VvbV9wb2ludCgpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsgCiAgZ2VvbV90ZXh0KHNpemU9NCxudWRnZV95ID0uMDMpCmBgYAoKKipsb2dfcmlnaHQsIHJlcHVibGljYW5zKioKCmBgYHtyfQpmaW5hbF9zcHIgJT4lCiAgZmlsdGVyKHBvbGlfcGFydHkgPT0gIlJlcHVibGljYW4iKSAlPiUKICBncm91cF9ieShmb3JtLHRyaWFsX2NvbmdydWVuY3ksdHJpYWxfZ2VuZGVyLG1vcnBoX3R5cGUpICU+JQogIG11dGF0ZShyZXNpZF9ydF9tZWFuID0gbWVhbihyZXNpZF9ydCkpICU+JQogIGZpbHRlcihsb2dfcmlnaHQgPiAtNSkgJT4lCiAgZ2dwbG90KGFlcyh4PWxvZ19yaWdodCx5PXJlc2lkX3J0X21lYW4sbGFiZWw9Zm9ybSkpICsKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgKyAKICBnZW9tX3RleHQoc2l6ZT00LG51ZGdlX3kgPS4wMykKYGBgCgpgYGB7cn0KZmluYWxfc3ByICU+JQogIGZpbHRlcihwb2xpX3BhcnR5ID09ICJSZXB1YmxpY2FuIikgJT4lCiAgZ3JvdXBfYnkoZm9ybSx0cmlhbF9jb25ncnVlbmN5LHRyaWFsX2dlbmRlcixtb3JwaF90eXBlKSAlPiUKICBtdXRhdGUocmVzaWRfcnRfbWVhbiA9IG1lYW4ocmVzaWRfcnQpKSAlPiUKICBmaWx0ZXIobG9nX3JpZ2h0ID4gLTUpICU+JQogIGdncGxvdChhZXMoeD1sb2dfcmlnaHQseT1yZXNpZF9ydF9tZWFuLGNvbG9yPXRyaWFsX2dlbmRlcixsaW5ldHlwZT10cmlhbF9jb25ncnVlbmN5LGxhYmVsPWZvcm0sc2hhcGU9dHJpYWxfY29uZ3J1ZW5jeSkpICsKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgKyAKICBnZW9tX3RleHQoc2l6ZT00LG51ZGdlX3kgPS4wMykKYGBgCgoqKmxvZ19hbGwsIHJlcHVibGljYW5zKioKCmBgYHtyfQpmaW5hbF9zcHIgJT4lCiAgZmlsdGVyKHBvbGlfcGFydHkgPT0gIlJlcHVibGljYW4iKSAlPiUKICBncm91cF9ieShmb3JtLHRyaWFsX2NvbmdydWVuY3ksdHJpYWxfZ2VuZGVyLG1vcnBoX3R5cGUpICU+JQogIG11dGF0ZShyZXNpZF9ydF9tZWFuID0gbWVhbihyZXNpZF9ydCkpICU+JQogIGZpbHRlcihsb2dfcmlnaHQgPiAtNSkgJT4lCiAgZ2dwbG90KGFlcyh4PWxvZ19hbGwseT1yZXNpZF9ydF9tZWFuLGNvbG9yPXRyaWFsX2dlbmRlcixsaW5ldHlwZT10cmlhbF9jb25ncnVlbmN5LGxhYmVsPWZvcm0sc2hhcGU9dHJpYWxfY29uZ3J1ZW5jeSkpICsKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgKyAKICBnZW9tX3RleHQoc2l6ZT00LG51ZGdlX3kgPS4wMykKYGBgCgoqKmxvZ19sZWZ0LCByZXB1YmxpY2FucyoqCgpgYGB7cn0KZmluYWxfc3ByICU+JQogIGZpbHRlcihwb2xpX3BhcnR5ID09ICJSZXB1YmxpY2FuIikgJT4lCiAgZ3JvdXBfYnkoZm9ybSx0cmlhbF9jb25ncnVlbmN5LHRyaWFsX2dlbmRlcixtb3JwaF90eXBlKSAlPiUKICBtdXRhdGUocmVzaWRfcnRfbWVhbiA9IG1lYW4ocmVzaWRfcnQpKSAlPiUKICBmaWx0ZXIobG9nX3JpZ2h0ID4gLTUpICU+JQogIGdncGxvdChhZXMoeD1sb2dfbGVmdCx5PXJlc2lkX3J0X21lYW4sY29sb3I9dHJpYWxfZ2VuZGVyLGxpbmV0eXBlPXRyaWFsX2NvbmdydWVuY3ksbGFiZWw9Zm9ybSxzaGFwZT10cmlhbF9jb25ncnVlbmN5KSkgKwogIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iKSArIAogIGdlb21fdGV4dChzaXplPTQsbnVkZ2VfeSA9LjAzKQpgYGAKCmBgYHtyfQpjb3IoZmluYWxfc3ByJGxvZ19hbGwsZmluYWxfc3ByJGxvZ19sZWZ0KQpgYGAKCgpgYGB7cn0KY29yKGZpbmFsX3NwciRsb2dfYWxsLGZpbmFsX3NwciRsb2dfcmlnaHQpCmBgYAoKCmBgYHtyfQpjb3IoZmluYWxfc3ByJGxvZ19sZWZ0LGZpbmFsX3NwciRsb2dfcmlnaHQpCmBgYAoKCiMjIFByZWxpbWluYXJ5IFZpc3VhbGlzYXRpb25zCgpUaGVzZSBwbG90cyBleHBsb3JlIHNpbmdsZSBmYWNldHMgYWxvbmcgd2hpY2ggaW5kaXZpZHVhbCBwcmVkaWN0aW9ucyBtaWdodCBiZSBtYWRlIGFib3V0IHJlYWRpbmcgdGltZXMuIAoKIyMjIFJlYWRpbmcgVGltZSBieSBOb3JtaW5nIAoKYGBge3J9CmZpbmFsX3NwciAlPiUKICBnZ3Bsb3QoYWVzKHg9Zm9ybV9ub3JtLHk9cmVzaWRfcnQpKSArCiAgZ2VvbV9wb2ludCgpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSdsbScpCmBgYApgCmBgYHtyfQpmaW5hbF9zcHIgJT4lCiAgZ3JvdXBfYnkoZm9ybSx0cmlhbF9nZW5kZXIsdHJpYWxfY29uZ3J1ZW5jeSkgJT4lCiAgbXV0YXRlKG1lYW5fcmVzaWRfcnQgPSBtZWFuKHJlc2lkX3J0KSkgJT4lCiAgZ2dwbG90KGFlcyh4PWZvcm1fbm9ybSx5PW1lYW5fcmVzaWRfcnQsY29sb3I9dHJpYWxfZ2VuZGVyLGxpbmV0eXBlPXRyaWFsX2NvbmdydWVuY3ksc2hhcGU9dHJpYWxfY29uZ3J1ZW5jeSkpICsKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9J2xtJykKYGBgCgpgYGB7cn0KZmluYWxfc3ByICU+JQogIGdyb3VwX2J5KGZvcm0sdHJpYWxfZ2VuZGVyLHRyaWFsX2NvbmdydWVuY3kpICU+JQogIG11dGF0ZShtZWFuX3Jlc2lkX3J0ID0gbWVhbihyZXNpZF9ydCkpICU+JQogIGdncGxvdChhZXMoeD1sZXhlbWVfbm9ybSx5PW1lYW5fcmVzaWRfcnQsY29sb3I9dHJpYWxfZ2VuZGVyLGxpbmV0eXBlPXRyaWFsX2NvbmdydWVuY3ksc2hhcGU9dHJpYWxfY29uZ3J1ZW5jeSkpICsKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9J2xtJykKYGBgCgpgYGB7cn0KZmluYWxfc3ByICU+JQogIGZpbHRlcihsZXhlbWUgIT0gImZsaWdodCBhdHRlbmRhbnQiKSAlPiUKICBncm91cF9ieShmb3JtLHRyaWFsX2dlbmRlcix0cmlhbF9jb25ncnVlbmN5KSAlPiUKICBtdXRhdGUobWVhbl9yZXNpZF9ydCA9IG1lYW4ocmVzaWRfcnQpKSAlPiUKICBnZ3Bsb3QoYWVzKHg9bGV4ZW1lX25vcm0seT1tZWFuX3Jlc2lkX3J0LGNvbG9yPXRyaWFsX2dlbmRlcixsaW5ldHlwZT10cmlhbF9jb25ncnVlbmN5LHNoYXBlPXRyaWFsX2NvbmdydWVuY3kpKSArCiAgZ2VvbV9wb2ludCgpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSdsbScpCmBgYAoKIyMjIFJlYWRpbmcgVGltZSBieSBGcmVxdWVuY3kKCioqTGVmdCBXaW5nLCBBbGwgSXRlbXMqKgoKYGBge3J9CmZpbmFsX3NwciAlPiUKICBnZ3Bsb3QoYWVzKHg9bWVhbl9mcmVxX2xlZnQseT1yZXNpZF9ydCkpICsKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9J2xtJykKYGBgCgoqKkxlZnQgV2luZywgTmV1dHJhbCBJdGVtcyoqCgpgYGB7cn0Kc2FuaXR5ID0gZmluYWxfc3ByICU+JQogIGZpbHRlcih0cmlhbF9jb25ncnVlbmN5PT0ibmV1dHJhbCIpCmBgYAoKCmBgYHtyfQpmaW5hbF9zcHIgJT4lCiAgZmlsdGVyKHRyaWFsX2NvbmdydWVuY3k9PSJuZXV0cmFsIikgJT4lCiAgZ2dwbG90KGFlcyh4PW1lYW5fZnJlcV9sZWZ0LHk9cmVzaWRfcnQpKSArCiAgZ2VvbV9wb2ludCgpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSdsbScpCmBgYAoKKipSaWdodCBXaW5nKioKCmBgYHtyfQpmaW5hbF9zcHIgJT4lCiAgZ2dwbG90KGFlcyh4PW1lYW5fZnJlcV9yaWdodCx5PXJlc2lkX3J0KSkgKwogIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0nbG0nKQpgYGAKCmBgYHtyfQpmaW5hbF9zcHIgJT4lCiAgZmlsdGVyKHRyaWFsX2NvbmdydWVuY3k9PSJuZXV0cmFsIikgJT4lCiAgZ2dwbG90KGFlcyh4PW1lYW5fZnJlcV9yaWdodCx5PXJlc2lkX3J0KSkgKwogIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0nbG0nKQpgYGAKCiMjIyBSZWFkaW5nIFRpbWUgYnkgSWRlb2xvZ3kgCgoqKkdlbmRlciBUb3RhbCoqCmBgYHtyfQpmaW5hbF9zcHIgJT4lCiAgZmlsdGVyKGdlbmRlcl90b3RhbCA8IDUxKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2VuZGVyX3RvdGFsLHk9cmVzaWRfcnQsY29sb3I9dHJpYWxfZ2VuZGVyLGxpbmV0eXBlPXRyaWFsX2NvbmdydWVuY3kpKSArCiAgZ2VvbV9wb2ludCgpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSdsbScpICMgKyAKIyAgZmFjZXRfZ3JpZCh0cmlhbF9nZW5kZXJ+dHJpYWxfY29uZ3J1ZW5jeSkKYGBgCgoqKkdlbmRlciBMaW5rKioKYGBge3J9CmZpbmFsX3NwciAlPiUKICBmaWx0ZXIodHJpYWxfY29uZ3J1ZW5jeSA9PSAibmV1dHJhbCIpICU+JQogIGdncGxvdChhZXMoeD1nZW5kZXJfbGluayx5PXJlc2lkX3J0KSkgKwogIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0nbG0nKQpgYGAKCioqR2VuZGVyIFRyYW5zZW5kZW5jZSoqCmBgYHtyfQpmaW5hbF9zcHIgJT4lCiAgZmlsdGVyKHRyaWFsX2NvbmdydWVuY3kgPT0gIm5ldXRyYWwiKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2VuZGVyX3RyYW5zLHk9cmVzaWRfcnQpKSArCiAgZ2VvbV9wb2ludCgpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSdsbScpCmBgYAoKIyMjIFJlYWRpbmcgVGltZSBieSBSZWFsLVdvcmxkIFByb2JhYmlsaXRpZXMgCgoKCmBgYHtyfQpmaW5hbF9zcHIgPC0gZmluYWxfc3ByICU+JQogIG11dGF0ZSh0cmlhbF9jb25ncnVlbmN5ID0gYXMuZmFjdG9yKHRyaWFsX2NvbmdydWVuY3kpKSAlPiUKICBtdXRhdGUodHJpYWxfY29uZ3J1ZW5jeSA9IGZjdF9yZWxldmVsKHRyaWFsX2NvbmdydWVuY3ksIm5ldXRyYWwiKSkgJT4lCiAgbXV0YXRlKHRyaWFsX2dlbmRlciA9IGFzLmZhY3Rvcih0cmlhbF9nZW5kZXIpKSAlPiUKICBtdXRhdGUoY19nZW5kZXJfdG90YWwgPSBzY2FsZShnZW5kZXJfdG90YWwsc2NhbGU9RkFMU0UpKSAlPiUKICBtdXRhdGUoY19nZW5kZXJfdHJhbnMgPSBzY2FsZShnZW5kZXJfdHJhbnMsc2NhbGU9RkFMU0UpKSAlPiUKICBtdXRhdGUoY19nZW5kZXJfbGluayA9IHNjYWxlKGdlbmRlcl9saW5rLHNjYWxlPUZBTFNFKSkgJT4lCiAgbXV0YXRlKGNfdHJpYWxfZ2VuZGVyID0gc2NhbGUoYXMubnVtZXJpYyh0cmlhbF9nZW5kZXIpLHNjYWxlPUZBTFNFKSkgJT4lCiAgbXV0YXRlKGNfdHJpYWxfY29uZ3J1ZW5jeSA9IHNjYWxlKGFzLm51bWVyaWModHJpYWxfY29uZ3J1ZW5jeSksc2NhbGU9RkFMU0UpKQpgYGAKCmBgYHtyfQpzdWJqZWN0X21lYW5zIDwtIGZpbmFsX3NwciAlPiUKICBzZWxlY3Qod29ya2VyaWQsc3ViamVjdF9pbmZvcm1hdGlvbi5wYXJ0eV9hbGlnbm1lbnQsZ2VuZGVyX2xpbmssZ2VuZGVyX3RvdGFsLGdlbmRlcl90cmFucykgJT4lCiAgdW5pcXVlKCkKYGBgCgpgYGB7cn0Kc3ViamVjdF9tZWFuc193X3BhcnR5IDwtIGZpbmFsX3NwciAlPiUKICBzZWxlY3Qod29ya2VyaWQsc3ViamVjdF9pbmZvcm1hdGlvbi5wYXJ0eV9hbGlnbm1lbnQsZ2VuZGVyX2xpbmssZ2VuZGVyX3RvdGFsLGdlbmRlcl90cmFucykgJT4lCiAgZmlsdGVyKCFpcy5uYShzdWJqZWN0X2luZm9ybWF0aW9uLnBhcnR5X2FsaWdubWVudCkpICU+JQogIHVuaXF1ZSgpCmBgYAoKIyMgTW9kZWxzCgojIyMgTW9kZWwgT25lOiBTaW1wbGUKCmBgYHtyfQptb2RlbF9vbmUgPC0gbG1lcihyZXNpZF9ydH5nZW5kZXJfdG90YWwqdHJpYWxfY29uZ3J1ZW5jeSp0cmlhbF9nZW5kZXIgKyAoMSB8bmFtZSkgKyAoMXx3b3JrZXJpZCkgKyAoMXxsZXhlbWUpLCBkYXRhPWZpbmFsX3NwcikKYGBgCgpgYGB7cn0Kc3VtbWFyeShtb2RlbF9vbmUpCmBgYAoKIyMjIE1vZGVsIFR3bzogU2ltcGxlIG1vZGVsIHdpdGggY2VudGVyZWQgdmFyaWFibGVzCgpgYGB7cn0KbW9kZWxfdHdvIDwtIGxtZXIocmVzaWRfcnR+Y19nZW5kZXJfdG90YWwqY190cmlhbF9jb25ncnVlbmN5KmNfdHJpYWxfZ2VuZGVyICsgKDEgfG5hbWUpICsgKDF8d29ya2VyaWQpICsgKDF8bGV4ZW1lKSwgZGF0YT1maW5hbF9zcHIpCmBgYAoKYGBge3J9CnN1bW1hcnkobW9kZWxfdHdvKQpgYGAKCiMjIyBNb2RlbCBUaHJlZTogQ2VudGVyZWQgSWRlb2xvZ3ksIENlbnRlcmVkIFRyaWFsIENvbmdydWVuY3ksIGFuZCBDZW50ZXJlZCBUcmlhbCBHZW5kZXIgd2l0aCBSYW5kb20gU2xvcGVzIGFuZCBJbnRlcmNlcHRzIGZvciBOYW1lLCBXb3JrZXJpZCwgYW5kIExleGVtZQoKYGBge3J9Cm1vZGVsX3RocmVlIDwtIGxtZXIocmVzaWRfcnR+Y19nZW5kZXJfdG90YWwqY190cmlhbF9jb25ncnVlbmN5KmNfdHJpYWxfZ2VuZGVyICsgKDEgKyBjX2dlbmRlcl90b3RhbCArIGNfdHJpYWxfY29uZ3J1ZW5jeXxuYW1lKSArICgxICsgY190cmlhbF9jb25ncnVlbmN5ICsgY190cmlhbF9nZW5kZXJ8d29ya2VyaWQpICsgKDEgKyBjX3RyaWFsX2NvbmdydWVuY3kgKyBjX3RyaWFsX2dlbmRlcnxsZXhlbWUpLCBkYXRhPWZpbmFsX3NwcikKYGBgCgpgYGB7cn0Kc3VtbWFyeShtb2RlbF90aHJlZSkKYGBgCgojIyMgTW9kZWwgRm91cgpTYW1lIGFzIE1vZGVsIDMsIGJ1dCB3aXRoIHBvbGl0aWNhbCBvcmllbnRhdGlvbiAoNS1wb2ludCBzY2FsZSkgYWRkZWQgaW4gd2l0aG91dCBpbnRlcmFjdGlvbnMKCmBgYHtyfQptb2RlbF9mb3VyIDwtIGxtZXIocmVzaWRfcnR+Y19nZW5kZXJfdG90YWwqY190cmlhbF9jb25ncnVlbmN5KmNfdHJpYWxfZ2VuZGVyICsgc3ViamVjdF9pbmZvcm1hdGlvbi5wYXJ0eV9hbGlnbm1lbnQgKyAoMSArIGNfZ2VuZGVyX3RvdGFsICsgY190cmlhbF9jb25ncnVlbmN5fG5hbWUpICsgKDEgKyBjX3RyaWFsX2NvbmdydWVuY3kgKyBjX3RyaWFsX2dlbmRlcnx3b3JrZXJpZCkgKyAoMSArIGNfdHJpYWxfY29uZ3J1ZW5jeSArIGNfdHJpYWxfZ2VuZGVyfGxleGVtZSksIGRhdGE9ZmluYWxfc3ByKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KG1vZGVsX2ZvdXIpCmBgYAoKIyMjIE1vZGVsIEZpdmU6IENvbmZpcm1pbmcgdGhlIFN0YXRpc3RpY2FsIERpZmZlcmVuY2UgaW4gSWRlb2xvZ3kgYmV0d2VlbiBQYXJ0aWVzCgpgYGB7cn0KbW9kZWxfZml2ZSA8LSBsbShnZW5kZXJfdG90YWx+c3ViamVjdF9pbmZvcm1hdGlvbi5wYXJ0eV9hbGlnbm1lbnQsIGRhdGE9c3ViamVjdF9tZWFucykKYGBgCgpgYGB7cn0Kc3VtbWFyeShtb2RlbF9maXZlKQpgYGAKCiMjIyBJbnRlcmltOiBBZGRpbmcgYnktc3ViamVjdCBJZGVvbG9neSBSZXNpZHVhbHMKCmBgYHtyfQppZGVvX3Jlc2lkdWFscyA8LSBkYXRhLmZyYW1lKAogIHN1YmplY3RfbWVhbnNfd19wYXJ0eVsid29ya2VyaWQiXSwKICBSZXNpZElkZW8gPSBsbShnZW5kZXJfdG90YWx+c3ViamVjdF9pbmZvcm1hdGlvbi5wYXJ0eV9hbGlnbm1lbnQsIGRhdGE9c3ViamVjdF9tZWFuc193X3BhcnR5KSRyZXNpZAopCmBgYAoKYGBge3J9CmZpbmFsX3NwciA8LSBsZWZ0X2pvaW4oZmluYWxfc3ByLGlkZW9fcmVzaWR1YWxzLGJ5PSJ3b3JrZXJpZCIpCmBgYAoKIyMjIE1vZGVsIFNpeDogUmVzaWR1YWwgSWRlb2xvZ2llcwpTYW1lIGFzIE1vZGVsIEZvdXIgYnV0IHdpdGggUmVzaWR1YWxJZGVvbG9naWVzIGluc3RlYWQgb2YgcmF3IGlkZW9sb2d5IHNjb3JlcwoKYGBge3J9Cm1vZGVsX3NpeCA8LSBsbWVyKHJlc2lkX3J0flJlc2lkSWRlbypjX3RyaWFsX2NvbmdydWVuY3kqY190cmlhbF9nZW5kZXIgKyBzdWJqZWN0X2luZm9ybWF0aW9uLnBhcnR5X2FsaWdubWVudCArICgxICsgUmVzaWRJZGVvICsgY190cmlhbF9jb25ncnVlbmN5fG5hbWUpICsgKDEgKyBjX3RyaWFsX2NvbmdydWVuY3kgKyBjX3RyaWFsX2dlbmRlcnx3b3JrZXJpZCkgKyAoMSArIGNfdHJpYWxfY29uZ3J1ZW5jeSArIGNfdHJpYWxfZ2VuZGVyfGxleGVtZSksIGRhdGE9ZmluYWxfc3ByKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KG1vZGVsX3NpeCkKYGBgCgpgYGB7cn0KZmluYWxfc3ByICU+JQogIGdncGxvdChhZXMoeD1SZXNpZElkZW8seT1yZXNpZF9ydCkpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgZ2VvbV9zbW9vdGgoKQpgYGAKCiMjIyBNb2RlbCBTZXZlbgpTYW1lIGFzIG1vZGVsIHNpeCwgYnV0IHdpdGggYWRkZWQgbG9nX2FsbCBmcmVxdWVuY3kKCmBgYHtyfQptb2RlbF9zZXZlbiA8LSBsbWVyKHJlc2lkX3J0flJlc2lkSWRlbypjX3RyaWFsX2NvbmdydWVuY3kqY190cmlhbF9nZW5kZXIgKyBzdWJqZWN0X2luZm9ybWF0aW9uLnBhcnR5X2FsaWdubWVudCArIGxvZ19hbGwgKyAoMSArIFJlc2lkSWRlbyArIGNfdHJpYWxfY29uZ3J1ZW5jeXxuYW1lKSArICgxICsgY190cmlhbF9jb25ncnVlbmN5ICsgY190cmlhbF9nZW5kZXJ8d29ya2VyaWQpICsgKDEgKyBjX3RyaWFsX2NvbmdydWVuY3kgKyBjX3RyaWFsX2dlbmRlcnxsZXhlbWUpLCBkYXRhPWZpbmFsX3NwcikKYGBgCgpgYGB7cn0Kc3VtbWFyeShtb2RlbF9zZXZlbikKYGBgCgoKIyMjIE1vZGVsIEVpZ2h0ClNhbWUgYXMgbW9kZWwgc2V2ZW4sIGJ1dCB3aXRoIGFkZGVkIG5ldXRyYWwgbGV4ZW1lLWxldmVsIG5vcm1zCgpgYGB7cn0KbW9kZWxfZWlnaHQgPC0gbG1lcihyZXNpZF9ydH5SZXNpZElkZW8qY190cmlhbF9jb25ncnVlbmN5KmNfdHJpYWxfZ2VuZGVyICsgc3ViamVjdF9pbmZvcm1hdGlvbi5wYXJ0eV9hbGlnbm1lbnQgKyBsb2dfYWxsICsgbGV4ZW1lX25vcm0gKyAoMSArIFJlc2lkSWRlbyArIGNfdHJpYWxfY29uZ3J1ZW5jeXxuYW1lKSArICgxICsgY190cmlhbF9jb25ncnVlbmN5ICsgY190cmlhbF9nZW5kZXJ8d29ya2VyaWQpICsgKDEgKyBjX3RyaWFsX2NvbmdydWVuY3kgKyBjX3RyaWFsX2dlbmRlcnxsZXhlbWUpLCBkYXRhPWZpbmFsX3NwcikKYGBgCgpgYGB7cn0Kc3VtbWFyeShtb2RlbF9laWdodCkKYGBgCgoKIyMjIEludGVyaW06IGFkZGluZyByZXNpZHVhbCB0cmFucyBhbmQgbGluayBzdWJzY29yZXMKCmBgYHtyfQp0cmFuc19yZXNpZHVhbHMgPC0gZGF0YS5mcmFtZSgKICBzdWJqZWN0X21lYW5zX3dfcGFydHlbIndvcmtlcmlkIl0sCiAgUmVzaWRUcmFucyA9IGxtKGdlbmRlcl90cmFuc35zdWJqZWN0X2luZm9ybWF0aW9uLnBhcnR5X2FsaWdubWVudCwgZGF0YT1zdWJqZWN0X21lYW5zX3dfcGFydHkpJHJlc2lkCikKYGBgCgpgYGB7cn0KZmluYWxfc3ByIDwtIGxlZnRfam9pbihmaW5hbF9zcHIsdHJhbnNfcmVzaWR1YWxzLGJ5PSJ3b3JrZXJpZCIpCmBgYAoKYGBge3J9CmxpbmtfcmVzaWR1YWxzIDwtIGRhdGEuZnJhbWUoCiAgc3ViamVjdF9tZWFuc193X3BhcnR5WyJ3b3JrZXJpZCJdLAogIFJlc2lkTGluayA9IGxtKGdlbmRlcl9saW5rfnN1YmplY3RfaW5mb3JtYXRpb24ucGFydHlfYWxpZ25tZW50LCBkYXRhPXN1YmplY3RfbWVhbnNfd19wYXJ0eSkkcmVzaWQKKQpgYGAKCmBgYHtyfQpmaW5hbF9zcHIgPC0gbGVmdF9qb2luKGZpbmFsX3NwcixsaW5rX3Jlc2lkdWFscyxieT0id29ya2VyaWQiKQpgYGAKCiMjIyBNb2RlbCBOaW5lClNhbWUgYXMgbW9kZWwgZWlnaHQsIGJ1dCB3aXRoIGdlbmRlciB0cmFuc2VuZGVuY2UgCgpgYGB7cn0KbW9kZWxfbmluZSA8LSBsbWVyKHJlc2lkX3J0flJlc2lkVHJhbnMqY190cmlhbF9jb25ncnVlbmN5KmNfdHJpYWxfZ2VuZGVyICsgc3ViamVjdF9pbmZvcm1hdGlvbi5wYXJ0eV9hbGlnbm1lbnQgKyBsb2dfYWxsICsgbGV4ZW1lX25vcm0gKyAoMSArIFJlc2lkVHJhbnMgKyBjX3RyaWFsX2NvbmdydWVuY3l8bmFtZSkgKyAoMSArIGNfdHJpYWxfY29uZ3J1ZW5jeSArIGNfdHJpYWxfZ2VuZGVyfHdvcmtlcmlkKSArICgxICsgY190cmlhbF9jb25ncnVlbmN5ICsgY190cmlhbF9nZW5kZXJ8bGV4ZW1lKSwgZGF0YT1maW5hbF9zcHIpCmBgYAoKYGBge3J9CnN1bW1hcnkobW9kZWxfbmluZSkKYGBgCgpgYGB7cn0KZmluYWxfc3ByICU+JQogIGdncGxvdChhZXMoeD0gZ2VuZGVyX3RyYW5zLCB5PXJlc2lkX3J0KSkgKyAKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikKYGBgCgoKIyMjIE1vZGVsIFRlbgpTYW1lIGFzIG1vZGVsIG5pbmUsIGJ1dCB3aXRoIGdlbmRlciBsaW5rIAoKYGBge3J9Cm1vZGVsX3RlbiA8LSBsbWVyKHJlc2lkX3J0flJlc2lkTGluaypjX3RyaWFsX2NvbmdydWVuY3kqY190cmlhbF9nZW5kZXIgKyBzdWJqZWN0X2luZm9ybWF0aW9uLnBhcnR5X2FsaWdubWVudCArIGxvZ19hbGwgKyBsZXhlbWVfbm9ybSArICgxICsgUmVzaWRMaW5rICsgY190cmlhbF9jb25ncnVlbmN5fG5hbWUpICsgKDEgKyBjX3RyaWFsX2NvbmdydWVuY3kgKyBjX3RyaWFsX2dlbmRlcnx3b3JrZXJpZCkgKyAoMSArIGNfdHJpYWxfY29uZ3J1ZW5jeSArIGNfdHJpYWxfZ2VuZGVyfGxleGVtZSksIGRhdGE9ZmluYWxfc3ByKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KG1vZGVsX3RlbikKYGBgCgoKYGBge3J9CmZpbmFsX3NwciAlPiUKICBnZ3Bsb3QoYWVzKHg9IGdlbmRlcl9saW5rLCB5PXJlc2lkX3J0KSkgKyAKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikKYGBgCgoKIyMjIE1vZGVsIEVsZXZlbgoKYGBge3J9CmxpbmtfcmVzaWR1YWxzIDwtIGRhdGEuZnJhbWUoCiAgZnJlcXVlbmN5WyJ3b3JrZXJpZCJdLAogIFJlc2lkTGluayA9IGxtKGdlbmRlcl9saW5rfnN1YmplY3RfaW5mb3JtYXRpb24ucGFydHlfYWxpZ25tZW50LCBkYXRhPXN1YmplY3RfbWVhbnNfd19wYXJ0eSkkcmVzaWQKKQpgYGAKCmBgYHtyfQpmaW5hbF9zcHIgPC0gbGVmdF9qb2luKGZpbmFsX3NwcixsaW5rX3Jlc2lkdWFscyxieT0id29ya2VyaWQiKQpgYGAKCmBgYHtyfQpmaW5hbF9zcHIgPC0gZmluYWxfc3ByICU+JQogIApgYGAKCgpgYGB7cn0KbW9kZWxfZWxldmVuIDwtIGxtZXIocmVzaWRfcnR+UmVzaWRJZGVvICogY190cmlhbF9nZW5kZXIgKyByZXNpZF9sZXhlbWVfbm9ybSArIGxvZ19hbGwqcG9saV9wYXJ0eSgzX2xldmVsKSArICgxICsgUmVzaWRJZGVvICsgcmVzaWRfbGV4ZW1lX25vcm0gKyBsb2dfYWxsKnBvbGlfcGFydHkgfCBuYW1lKSArICgxICsgY190cmlhbF9nZW5kZXIgKyByZXNpZF9sZXhlbWVfbm9ybSArIGxvZ19hbGwgfHdvcmtlcmlkKSArICgxICsgY190cmlhbF9nZW5kZXIgKyBSZXNpZElkZW8gKyBwb2xpX3BhcnR5IHwgbGV4ZW1lKSkKYGBgCgoKCgoKIyMgT3RoZXIgU2hpdAoKCgoKYGBge3J9CmZpbmFsX3NwciA8LSBmaW5hbF9zcHIgJT4lCiAgbXV0YXRlKG5vcm1fc2tldyA9IGlmZWxzZShsZXhlbWVfbm9ybSA+IDQsICJmZW1hbGUiLCJtYWxlIikpCmBgYAoKYGBge3J9CmZpbmFsX3NwciAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2VuZGVyX2xpbmsseT1nZW5kZXJfdHJhbnMpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikKYGBgCgpgYGB7cn0KZmluYWxfc3ByICU+JQogIGdncGxvdChhZXMoeD1nZW5kZXJfbGluayx5PWdlbmRlcl90b3RhbCkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iKQpgYGAKCmBgYHtyfQpmaW5hbF9zcHIgJT4lCiAgZ2dwbG90KGFlcyh4PWdlbmRlcl90cmFucyx5PWdlbmRlcl90b3RhbCkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iKQpgYGAKCiMjIyBHcmFwaHMKCmBgYHtyfQpnZ3Bsb3QoZmluYWxfc3ByLCBhZXMoeD1nZW5kZXJfdG90YWwsIHk9cmVzaWRfcnQsIGNvbG9yPW5vcm1fc2tldykpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpCmBgYAoKCiMgQnJlYWsgUG9pbnQ6IDEwOjA5YW0gMSBEZWMKCgpgYGB7cn0KZmluYWxfc3ByICU+JQogIGdyb3VwX2J5KHN1YmplY3RfaW5mb3JtYXRpb24ucGFydHlfYWxpZ25tZW50KSAlPiUKICBzdW1tYXJpemUoZ2VuZGVyX3RyYW5zID0gbWVhbihnZW5kZXJfdHJhbnMpKSAlPiUKICBnZ3Bsb3QoYWVzKHg9c3ViamVjdF9pbmZvcm1hdGlvbi5wYXJ0eV9hbGlnbm1lbnQseT1nZW5kZXJfdHJhbnMpKSArIAogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKyAKICBnZW9tX2ppdHRlcihkYXRhPXN1YmplY3RfbWVhbnMsIGFlcyh5PWdlbmRlcl90cmFucyx4PXN1YmplY3RfaW5mb3JtYXRpb24ucGFydHlfYWxpZ25tZW50KSxoZWlnaHQ9MCkKYGBgCgpgYGB7cn0KZmluYWxfc3ByICU+JQogIGdyb3VwX2J5KHN1YmplY3RfaW5mb3JtYXRpb24ucGFydHlfYWxpZ25tZW50KSAlPiUKICBzdW1tYXJpemUobWVhbl9nZW5kZXJfbGluayA9IG1lYW4oZ2VuZGVyX2xpbmspKSAlPiUKICBnZ3Bsb3QoYWVzKHg9c3ViamVjdF9pbmZvcm1hdGlvbi5wYXJ0eV9hbGlnbm1lbnQseT1tZWFuX2dlbmRlcl9saW5rKSkgKyAKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpCmBgYAoKKipDYWxjdWxhdGluZyBTcGVha2VyIE1lYW5zIGJ5IENvbmRpdGlvbioqIAoKYGBge3J9CnNwcnRfc3BlYWtlcl9tZWFucyA8LSBzcHJ0X2RhdGEgJT4lCiAgZ3JvdXBfYnkoY29uZGl0aW9uLHBvbGlfcGFydHksd29ya2VyaWQpICU+JQogIHN1bW1hcml6ZShNZWFuUlQ9bWVhbihyZXNpZF9ydCkpCmBgYAoKKipDb25kaXRpb24gTWVhbnMgd2l0aCBQYXJ0aWNpcGFudCBNZWFucyoqCgpgYGB7cn0Kc3BydF9kYXRhICU+JQogIGdyb3VwX2J5KGNvbmRpdGlvbix0cmlhbF9nZW5kZXIpICU+JQogIHN1bW1hcml6ZShNZWFuUlQgPSBtZWFuKHJlc2lkX3J0KSwgQ0kuTG93ID0gY2kubG93KHJlc2lkX3J0KSwgQ0kuSGlnaCA9IGNpLmhpZ2gocmVzaWRfcnQpKSAlPiUKICBtdXRhdGUoWU1pbiA9IE1lYW5SVCAtIENJLkxvdywgWU1heCA9IE1lYW5SVCArIENJLkhpZ2gpICU+JQogIGdncGxvdChhZXMoeD1jb25kaXRpb24seT1NZWFuUlQsY29sb3I9dHJpYWxfZ2VuZGVyKSkgKyAKICBnZW9tX3BvaW50KHNpemU9MykgKyAKICBnZW9tX2ppdHRlcihkYXRhID0gc3BydF9zcGVha2VyX21lYW5zLCBhZXMoeT1NZWFuUlQpLGFscGhhPS4xLGNvbG9yPSdibGFjaycpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1ZTWluLHltYXg9WU1heCksIHdpZHRoPS4yNSkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYnJhbl9wYWxldHRlLCApICsgCiAgbGFicyh4PSJDb25kaXRpb24iLHk9IlJlc2lkdWFsIFJlYWRpbmcgVGltZSIsIGNvbG9yPSJUcmlhbCBHZW5kZXIiKQpgYGAKCmBgYHtyfQpnZ3NhdmUoInNwcnRfYWxsLnBuZyIsIHdpZHRoPTcsaGVpZ2h0PTUscGF0aD0nL1VzZXJzL2JyYW5wYXAvRGVza3RvcC9nZW5kZXJfcHJvY2Vzc2luZy90YWxrc19hbmRfcGFwZXJzL3FwX3BhcGVyL2ZpZ3VyZXMnKQpgYGAKCmBgYHtyfQpzcHJ0X2RhdGEgJT4lCiAgZ3JvdXBfYnkoY29uZGl0aW9uLHRyaWFsX2dlbmRlcixwb2xpX3BhcnR5KSAlPiUKICBzdW1tYXJpemUoTWVhblJUID0gbWVhbihyZXNpZF9ydCksIENJLkxvdyA9IGNpLmxvdyhyZXNpZF9ydCksIENJLkhpZ2ggPSBjaS5oaWdoKHJlc2lkX3J0KSkgJT4lCiAgbXV0YXRlKFlNaW4gPSBNZWFuUlQgLSBDSS5Mb3csIFlNYXggPSBNZWFuUlQgKyBDSS5IaWdoKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Y29uZGl0aW9uLHk9TWVhblJULGNvbG9yPXRyaWFsX2dlbmRlcikpICsgCiAgZ2VvbV9wb2ludChzaXplPTMpICsgCiAgZ2VvbV9qaXR0ZXIoZGF0YSA9IHNwcnRfc3BlYWtlcl9tZWFucywgYWVzKHk9TWVhblJUKSxhbHBoYT0uMSxjb2xvcj0nYmxhY2snKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49WU1pbix5bWF4PVlNYXgpLCB3aWR0aD0uMjUpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGJyYW5fcGFsZXR0ZSwgKSArIAogIGxhYnMoeD0iQ29uZGl0aW9uIix5PSJSZXNpZHVhbCBSZWFkaW5nIFRpbWUiLCBjb2xvcj0iVHJpYWwgR2VuZGVyIikgKwogIGZhY2V0X3dyYXAofnBvbGlfcGFydHkpCmBgYAoKKipSZWFkaW5nIFRpbWUgYnkgR2VuZGVyIElkZW9sb2d5KioKCioqQ2FsY3VsYXRpbmcgU3BlYWtlciBNZWFucyBieSBJZGVvbG9neSoqCgpgYGB7cn0Kc3BydF9zcGVha2VyX21lYW5zX2lkZW9sb2d5IDwtIHNwcnRfZGF0YSAlPiUKICBncm91cF9ieShnZW5kZXJfdG90YWwsd29ya2VyaWQsdHJpYWxfZ2VuZGVyLHRyaWFsX2NvbmdydWVuY3kscG9saV9wYXJ0eSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5ydCA9IG1lYW4ocmVzaWRfcnQpKQpgYGAKCgpgYGB7cn0Kc3BydF9zcGVha2VyX21lYW5zX2lkZW9sb2d5ICU+JQogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIGdncGxvdChhZXMoeD1nZW5kZXJfdG90YWwseT1tZWFucnQsY29sb3I9dHJpYWxfZ2VuZGVyLGxpbmV0eXBlPXRyaWFsX2NvbmdydWVuY3kpKSArIAogIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0nbG0nKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBicmFuX3BhbGV0dGUsICkgKyAKICBmYWNldF93cmFwKH5wb2xpX3BhcnR5KQpgYGAKCioqUmVhZGluZyBUaW1lIG9uIE5lb2xvZ2lzbXMqKiAKCmBgYHtyfQpzcHJ0X2RhdGEgJT4lCiAgZmlsdGVyKCFpcy5uYShwb2xpX3BhcnR5KSkgJT4lCiAgZ3JvdXBfYnkoZ2VuZGVyX3RvdGFsLHdvcmtlcmlkLHRyaWFsX2dlbmRlcixwb2xpX3BhcnR5LGNvbmRpdGlvbikgJT4lCiAgc3VtbWFyaXNlKG1lYW5ydCA9IG1lYW4ocmVzaWRfcnQpKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2VuZGVyX3RvdGFsLHk9bWVhbnJ0LGNvbG9yPXRyaWFsX2dlbmRlcikpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSdsbScpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGJyYW5fcGFsZXR0ZSwgKSArIAogIGZhY2V0X2dyaWQoY29uZGl0aW9ufnBvbGlfcGFydHkpIApgYGAKCmBgYHtyfQpmaW5hbF9zcHIgJT4lIAogIGdncGxvdChhZXMoeCkpCmBgYAoKCmBgYHtyfQpzcHJ0X2RhdGEgJT4lCiAgZmlsdGVyKCFpcy5uYShwb2xpX3BhcnR5KSkgJT4lCiAgZmlsdGVyKHRyaWFsX2NvbmdydWVuY3kgPT0gIm5ldXRyYWwiKSAlPiUKICBncm91cF9ieShnZW5kZXJfdHJhbnMsd29ya2VyaWQsdHJpYWxfZ2VuZGVyLHBvbGlfcGFydHkpICU+JQogIHN1bW1hcmlzZShtZWFucnQgPSBtZWFuKHJlc2lkX3J0KSkgJT4lCiAgZ2dwbG90KGFlcyh4PWdlbmRlcl90cmFucyx5PW1lYW5ydCxjb2xvcj10cmlhbF9nZW5kZXIpKSArIAogIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0nbG0nKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBicmFuX3BhbGV0dGUsICkgKyAKICBmYWNldF93cmFwKH5wb2xpX3BhcnR5KSAKYGBgCgpgYGB7cn0Kc3BydF9kYXRhICU+JQogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIGZpbHRlcih0cmlhbF9jb25ncnVlbmN5ID09ICJuZXV0cmFsIikgJT4lCiAgZ3JvdXBfYnkoZ2VuZGVyX2xpbmssd29ya2VyaWQsdHJpYWxfZ2VuZGVyLHBvbGlfcGFydHkpICU+JQogIHN1bW1hcmlzZShtZWFucnQgPSBtZWFuKHJlc2lkX3J0KSkgJT4lCiAgZ2dwbG90KGFlcyh4PWdlbmRlcl9saW5rLHk9bWVhbnJ0LGNvbG9yPXRyaWFsX2dlbmRlcikpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSdsbScpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGJyYW5fcGFsZXR0ZSwgKSArIAogIGZhY2V0X3dyYXAofnBvbGlfcGFydHkpIApgYGAKCgpgYGB7cn0Kc3BydF9kYXRhIDwtIG1lcmdlKHNwcnRfZGF0YSxsZXhfZnJlcXMsYnk9ImxleGVtZSIpICU+JQogIG11dGF0ZShtZWFuX25ldXRyYWwgPSAoc3VtKG1lYW5fbGVmdF9uZXV0cmFsLG1lYW5fcmlnaHRfbmV1dHJhbCkpLzIpCmBgYAoKCmBgYHtyfQpzcHJ0X2RhdGEgJT4lCiAgZmlsdGVyKCFpcy5uYShwb2xpX3BhcnR5KSkgJT4lCiAgZmlsdGVyKHRyaWFsX2NvbmdydWVuY3kgPT0gIm5ldXRyYWwiKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2VuZGVyX3RvdGFsLHk9cmVzaWRfcnQsY29sb3I9dHJpYWxfZ2VuZGVyKSkgKyAKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9J2xtJykgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYnJhbl9wYWxldHRlLCApICsgCiAgbGFicyh4PSJHZW5kZXIgVG90YWwiLHk9IlJlc2lkdWFsIFJlYWRpbmcgVGltZSIsIGNvbG9yPSJUcmlhbCBHZW5kZXIiKQpgYGAKCmBgYHtyfQpnZ3NhdmUoInNwcnRfbmV1dHJhbF9ndC5wbmciLCB3aWR0aD03LGhlaWdodD01LHBhdGg9Jy9Vc2Vycy9icmFucGFwL0Rlc2t0b3AvZ2VuZGVyX3Byb2Nlc3NpbmcvdGFsa3NfYW5kX3BhcGVycy9xcF9wYXBlci9maWd1cmVzJykKYGBgCgoqKlJlYWRpbmcgVGltZSBieSBJdGVtKioKCmBgYHtyfQpzcHJ0X2RhdGEgJT4lCiAgZ3JvdXBfYnkoY29uZGl0aW9uLHRyaWFsX2dlbmRlcix0cmlhbF9jb25ncnVlbmN5LGxleGVtZSkgJT4lCiAgc3VtbWFyaXplKE1lYW5SVCA9IG1lYW4ocmVzaWRfcnQpLCBDSS5Mb3cgPSBjaS5sb3cocmVzaWRfcnQpLCBDSS5IaWdoID0gY2kuaGlnaChyZXNpZF9ydCkpICU+JQogIG11dGF0ZShZTWluID0gTWVhblJUIC0gQ0kuTG93LCBZTWF4ID0gTWVhblJUICsgQ0kuSGlnaCkgJT4lCiAgZ2dwbG90KGFlcyh4PWNvbmRpdGlvbix5PU1lYW5SVCxjb2xvcj10cmlhbF9nZW5kZXIsc2hhcGU9dHJpYWxfY29uZ3J1ZW5jeSkpICsgCiAgZ2VvbV9wb2ludChzaXplPTMpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPVlNaW4seW1heD1ZTWF4KSwgd2lkdGg9LjI1KSArIAogIGZhY2V0X3dyYXAofiBsZXhlbWUpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCB2anVzdCA9IC43LCBoanVzdD0uNykpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGJyYW5fcGFsZXR0ZSkKYGBgCioqV2hvbGUtUGFydHkgTWVhbnMqKgoKYGBge3J9CnNwcnRfZGF0YSAlPiUKICBmaWx0ZXIoIWlzLm5hKHBvbGlfcGFydHkpKSAlPiUKICBncm91cF9ieShwb2xpX3BhcnR5LGNvbmRpdGlvbix0cmlhbF9nZW5kZXIsdHJpYWxfY29uZ3J1ZW5jeSkgJT4lCiAgc3VtbWFyaXplKE1lYW5SVCA9IG1lYW4ocmVzaWRfcnQpLCBDSS5Mb3cgPSBjaS5sb3cocmVzaWRfcnQpLCBDSS5IaWdoID0gY2kuaGlnaChyZXNpZF9ydCkpICU+JQogIG11dGF0ZShZTWluID0gTWVhblJUIC0gQ0kuTG93LCBZTWF4ID0gTWVhblJUICsgQ0kuSGlnaCkgJT4lCiAgZ2dwbG90KGFlcyh4PWNvbmRpdGlvbix5PU1lYW5SVCxjb2xvcj10cmlhbF9nZW5kZXIsc2hhcGU9dHJpYWxfY29uZ3J1ZW5jeSkpICsgCiAgZ2VvbV9wb2ludChzaXplPTMpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPVlNaW4seW1heD1ZTWF4KSwgd2lkdGg9LjI1KSArIAogIGZhY2V0X3dyYXAofiBwb2xpX3BhcnR5LCBucm93ID0gMSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gLjcsIGhqdXN0PS43KSkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYnJhbl9wYWxldHRlKSArCiAgbGFicyh4PSJDb25kaXRpb24iLCB5PSJSZXNpZHVhbCBSZWFkaW5nIFRpbWUiLCBzaGFwZT0iVHJpYWwgQ29uZ3J1ZW5jeSIsIGNvbG9yPSJUcmlhbCBHZW5kZXIiKQpgYGAKCmBgYHtyfQpnZ3NhdmUoInNwcnRfcGFydHkucG5nIiwgd2lkdGg9NyxoZWlnaHQ9NSxwYXRoPScvVXNlcnMvYnJhbnBhcC9EZXNrdG9wL2dlbmRlcl9wcm9jZXNzaW5nL3RhbGtzX2FuZF9wYXBlcnMvcXBfcGFwZXIvZmlndXJlcycpCmBgYAoKKipNb2RlbGxpbmcqKgoKYGBge3J9CnNwcnRfbW9kZWwgPC0gZmluYWxfc3ByICU+JQogIG11dGF0ZShjX2dlbmRlcl90b3RhbCA9IHNjYWxlKGdlbmRlcl90b3RhbCkpICU+JQogIG11dGF0ZShjYWdlID0gc2NhbGUoc3ViamVjdF9pbmZvcm1hdGlvbi5hZ2UpKSAlPiUKICBtdXRhdGUobWVhbl9hbGwgPSAobWVhbl9mcmVxX2xlZnQgKyBtZWFuX2ZyZXFfcmlnaHQpLzIpICU+JQogIG11dGF0ZShjX21lYW5fYWxsID0gc2NhbGUobWVhbl9hbGwpKSAlPiUKICBtdXRhdGUoY190cmlhbF9jb25ncnVlbmN5ID0gYXMubnVtZXJpYyhhcy5mYWN0b3IodHJpYWxfY29uZ3J1ZW5jeSkpLW1lYW4oYXMubnVtZXJpYyhhcy5mYWN0b3IodHJpYWxfY29uZ3J1ZW5jeSkpKSkgJT4lCiAgbXV0YXRlKGNfdHJpYWxfZ2VuZGVyID0gYXMubnVtZXJpYyhhcy5mYWN0b3IodHJpYWxfZ2VuZGVyKSktbWVhbihhcy5udW1lcmljKGFzLmZhY3Rvcih0cmlhbF9nZW5kZXIpKSkpICU+JQogIG11dGF0ZShjX2luZGlfbWVhbiA9IHNjYWxlKGluZGlfbWVhbikpCmBgYAoKYGBge3J9CmNvbXBsZXhfbW9kZWwgPC0gbG1lcihyZXNpZF9ydH5jX3RyaWFsX2NvbmdydWVuY3kgKyBjX2dlbmRlcl90b3RhbCArIHBvbGlfcGFydHkgKyBjX21lYW5fYWxsICsgY19pbmRpX21lYW4gKyAoMXx3b3JrZXJpZCkgKyAoMXxsZXhlbWUpICsgKDF8bmFtZSksZGF0YSA9IHNwcnRfbW9kZWwpCmBgYAoKYGBge3J9CnN1bW1hcnkoY29tcGxleF9tb2RlbCkKYGBgCgojIyMgQXV4aWxpYXJ5IEFuYWx5c2lzOiBSZXB1YmxpY2FucwoKYGBge3J9CmZpbmFsX3NwciAlPiUKICBmaWx0ZXIocG9saV9wYXJ0eSA9PSAiUmVwdWJsaWNhbiIpICU+JQogIGdyb3VwX2J5KHByb2xpZmVyYXRlLmNvbmRpdGlvbixjb25kaXRpb24sdHJpYWxfZ2VuZGVyLHRyaWFsX2NvbmdydWVuY3kpICU+JQogIHN1bW1hcml6ZShNZWFuUlQgPSBtZWFuKHJlc2lkX3J0KSwgQ0kuTG93ID0gY2kubG93KHJlc2lkX3J0KSwgQ0kuSGlnaCA9IGNpLmhpZ2gocmVzaWRfcnQpKSAlPiUKICBtdXRhdGUoWU1pbiA9IE1lYW5SVCAtIENJLkxvdywgWU1heCA9IE1lYW5SVCArIENJLkhpZ2gpICU+JQogIGdncGxvdChhZXMoeD1jb25kaXRpb24seT1NZWFuUlQsY29sb3I9dHJpYWxfZ2VuZGVyLHNoYXBlPXRyaWFsX2NvbmdydWVuY3kpKSArIAogIGdlb21fcG9pbnQoc2l6ZT0zKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1ZTWluLHltYXg9WU1heCksIHdpZHRoPS4yNSkgKyAKICBmYWNldF93cmFwKH4gcHJvbGlmZXJhdGUuY29uZGl0aW9uLCBucm93ID0gMSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gLjcsIGhqdXN0PS43KSkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYnJhbl9wYWxldHRlKSArCiAgbGFicyh4PSJDb25kaXRpb24iLCB5PSJSZXNpZHVhbCBSZWFkaW5nIFRpbWUiLCBzaGFwZT0iVHJpYWwgQ29uZ3J1ZW5jeSIsIGNvbG9yPSJUcmlhbCBHZW5kZXIiKQpgYGAKCmBgYHtyfQpzcHJfcmVwdWJsaWNhbnMgPC0gc3BydF9tb2RlbCAlPiUKICBmaWx0ZXIocG9saV9wYXJ0eSA9PSAiUmVwdWJsaWNhbiIpCmBgYAoKYGBge3J9CnJlcHViX21vZGVsIDwtIGxtZXIocmVzaWRfcnQgfiBwcm9saWZlcmF0ZS5jb25kaXRpb24gKyAoMXx3b3JrZXJpZCkgKyAoMXxuYW1lKSArICgxfGxleGVtZSksZGF0YT1zcHJfcmVwdWJsaWNhbnMpCmBgYAoKYGBge3J9CnN1bW1hcnkocmVwdWJfbW9kZWwpCmBgYAoKIyMgUHJvZHVjdGlvbiBUYXNrIFN0dWR5CgojIyMgTWV0aG9kcwoKIyMjIEFuYWx5c2lzCgoqKkRhdGEgUmVhZC1pbioqCgpgYGB7cn0KcHJvZF9kYXRhIDwtIHJlYWQuY3N2KCJwcm9kdWN0aW9uX2RhdGEuY3N2IikKYGBgCgoqKkV4Y2x1c2lvbnMqKgoKYGBge3J9CnByb2RfZXhjbHVzaW9uIDwtIHByb2RfZGF0YSAlPiUgZmlsdGVyKG5hbWU9PSdhdHRlbnRpb24nKSAlPiUKICBncm91cF9ieSh3b3JrZXJpZCkgJT4lCiAgc3VtbWFyaXNlKGFjY3VyYWN5ID0gbWVhbihjb3JyZWN0KSkgJT4lCiAgbXV0YXRlKGV4Y2x1ZGUgPSBpZmVsc2UoYWNjdXJhY3kgPCAwLjgwLCdZZXMnLCdObycpKSAlPiUKICBmaWx0ZXIoZXhjbHVkZSA9PSAiWWVzIikKYGBgCgpgYGB7cn0KcHJvZF9kYXRhIDwtIHByb2RfZGF0YVshKHByb2RfZGF0YSR3b3JrZXJpZCAlaW4lIHByb2RfZXhjbHVzaW9uJHdvcmtlcmlkKSxdCmBgYAoKKipBZGRpdGlvbmFsIEluZm9ybWF0aW9uKiogCgpgYGB7cn0KcHJvZF9kYXRhIDwtIHByb2RfZGF0YSAlPiUKICBtdXRhdGUoZ2VuZGVyX3RyYW5zID0gMTAwIC0gKHJvd01lYW5zKHByb2RfZGF0YVtnZW5kZXJfdHJhbnNjZW5kZW5jZV9jb2xzXSkpKSAlPiUKICBtdXRhdGUoZ2VuZGVyX2xpbmsgPSByb3dNZWFucyhwcm9kX2RhdGFbZ2VuZGVyX2xpbmtlZF9jb2xzXSkpIAoKZ2VuZGVyX2FsbCA9IGMoJ2dlbmRlcl90cmFucycsJ2dlbmRlcl9saW5rJykKCnByb2RfZGF0YSA8LSBwcm9kX2RhdGEgJT4lCiAgbXV0YXRlKGdlbmRlcl90b3RhbCA9IHJvd01lYW5zKHByb2RfZGF0YVtnZW5kZXJfYWxsXSkpCmBgYCAKCmBgYHtyfQpwcm9kX2RhdGEgPC0gcHJvZF9kYXRhICU+JQogIGZpbHRlcih0eXBlID09ICJjcml0aWNhbCIpICU+JQogIG11dGF0ZShyZXNwb25zZV9nZW5kZXIgPSBpZmVsc2UocmVzcG9uc2UgPT0gImFjdHJlc3MiIHwgcmVzcG9uc2UgPT0gImFuY2hvcndvbWFuIiB8IHJlc3BvbnNlID09ICJzdGV3YXJkZXNzIiB8IHJlc3BvbnNlID09ICJidXNpbmVzc3dvbWFuIiB8IHJlc3BvbnNlID09ICdjYW1lcmF3b21hbicgfCByZXNwb25zZSA9PSAnY29uZ3Jlc3N3b21hbicgfCByZXNwb25zZSA9PSAnY3JhZnRzd29tYW4nIHwgcmVzcG9uc2UgPT0gJ2NyZXd3b21hbicgfCByZXNwb25zZSA9PSAnZmlyZXdvbWFuJyB8IHJlc3BvbnNlID09ICdmb3Jld29tYW4nICB8IHJlc3BvbnNlID09ICdoZWlyZXNzJyB8IHJlc3BvbnNlID09ICdoZXJvaW5lJyB8IHJlc3BvbnNlID09ICdob3N0ZXNzJyB8IHJlc3BvbnNlID09ICdodW50cmVzcycgfCByZXNwb25zZSA9PSAnbGF5d29tYW4nIHwgcmVzcG9uc2UgPT0gJ3BvbGljZXdvbWFuJyB8IHJlc3BvbnNlID09ICdzYWxlc3dvbWFuJyB8IHJlc3BvbnNlID09ICdzdHVudHdvbWFuJyB8IHJlc3BvbnNlID09ICd2aWxsYWluZXNzJyB8IHJlc3BvbnNlID09ICd3ZWF0aGVyd29tYW4nLCJmZW1hbGUiLGlmZWxzZShyZXNwb25zZSA9PSAiYW5jaG9yIiB8IHJlc3BvbnNlID09ICJmbGlnaHQgYXR0ZW5kYW50IiB8IHJlc3BvbnNlID09ICJidXNpbmVzc3BlcnNvbiIgfCByZXNwb25zZSA9PSAnY2FtZXJhIG9wZXJhdG9yJyB8IHJlc3BvbnNlID09ICdjb25ncmVzc3BlcnNvbicgfCByZXNwb25zZSA9PSAnY3JhZnRzcGVyc29uJyB8IHJlc3BvbnNlID09ICdjcmV3bWVtYmVyJyB8IHJlc3BvbnNlID09ICdmaXJlZmlnaHRlcicgfCByZXNwb25zZSA9PSAnZm9yZXBlcnNvbicgfCByZXNwb25zZSA9PSAnbGF5cGVyc29uJyB8IHJlc3BvbnNlID09ICdwb2xpY2Ugb2ZmaWNlcicgfCByZXNwb25zZSA9PSAnc2FsZXNwZXJzb24nIHwgcmVzcG9uc2UgPT0gJ3N0dW50IGRvdWJsZScgfCByZXNwb25zZSA9PSAnbWV0ZW9yb2xvZ2lzdCcsIm5ldXRyYWwiLGlmZWxzZShyZXNwb25zZSA9PSAiYW5jaG9ybWFuIiB8IHJlc3BvbnNlID09ICJzdGV3YXJkIiB8IHJlc3BvbnNlID09ICJidXNpbmVzc21hbiIgfCByZXNwb25zZSA9PSAnY2FtZXJhbWFuJyB8IHJlc3BvbnNlID09ICdjb25ncmVzc21hbicgfCByZXNwb25zZSA9PSAnY3JhZnRzbWFuJyB8IHJlc3BvbnNlID09ICdjcmV3bWFuJyB8IHJlc3BvbnNlID09ICdmaXJlbWFuJyB8IHJlc3BvbnNlID09ICdmb3JlbWFuJyB8IHJlc3BvbnNlID09ICdsYXltYW4nIHwgcmVzcG9uc2UgPT0gJ3BvbGljZW1hbicgfCByZXNwb25zZSA9PSAnc2FsZXNtYW4nIHwgcmVzcG9uc2UgPT0gJ3N0dW50bWFuJyB8IHJlc3BvbnNlID09ICd3ZWF0aGVybWFuJywibWFsZSIsJ21hbGUvbmV1dHJhbCcpKSkpICU+JQogIG11dGF0ZShjb25ncnVlbmN5ID0gaWZlbHNlKGdlbmRlciA9PSByZXNwb25zZV9nZW5kZXIsInRydWUiLCJmYWxzZSIpKSAlPiUKICBtdXRhdGUobmV1dHJhbGl0eSA9IGlmZWxzZShyZXNwb25zZV9nZW5kZXIgPT0gIm5ldXRyYWwiLCJ0cnVlIiwiZmFsc2UiKSklPiUKICBtdXRhdGUobW9ycGhfdHlwZSA9IGlmZWxzZShsZXhlbWUhPSAnYWN0b3InICYgbGV4ZW1lIT0gJ2hvc3QnICYgbGV4ZW1lICE9J2h1bnRlcicgJiBsZXhlbWUhPSAndmlsbGFpbicgJiBsZXhlbWUhPSAnaGVpcicgJiBsZXhlbWUhPSAnaGVybycsJ2NvbXBvdW5kJywnYWRvcHRpb24nKSkgJT4lCiAgbXV0YXRlKHBvbGlfcGFydHkgPSBpZmVsc2Uoc3ViamVjdF9pbmZvcm1hdGlvbi5wYXJ0eV9hbGlnbm1lbnQgPT0gMSB8IHN1YmplY3RfaW5mb3JtYXRpb24ucGFydHlfYWxpZ25tZW50ID09IDIsJ1JlcHVibGljYW4nLGlmZWxzZShzdWJqZWN0X2luZm9ybWF0aW9uLnBhcnR5X2FsaWdubWVudCA9PSA0IHwgc3ViamVjdF9pbmZvcm1hdGlvbi5wYXJ0eV9hbGlnbm1lbnQgPT0gNSwnRGVtb2NyYXQnLCdOb24tUGFydGlzYW4nKSkpICU+JQogIG11dGF0ZShyZXNwb25zZV9uZXV0cmFsID0gaWZlbHNlKHJlc3BvbnNlX2dlbmRlciA9PSAibmV1dHJhbCIgfCByZXNwb25zZV9nZW5kZXIgPT0gIm1hbGUvbmV1dHJhbCIsMSwwKSkKYGBgCgpgYGB7cn0KcHJvZF9maW5hbCA8LSBsZWZ0X2pvaW4ocHJvZF9kYXRhLG5vcm1pbmdfbWVhbnNfbmV1dHJhbCxieT0ibGV4ZW1lIikKcHJvZF9maW5hbCA8LSBsZWZ0X2pvaW4ocHJvZF9maW5hbCxyZWFsX2Rpc3RzLGJ5PSJsZXhlbWUiKQpgYGAKCiMjIFByZWxpbWluYXJ5IFZpc3VhbGlzYXRpb25zCgojIyMgTmV1dHJhbCBQcm9kdWN0aW9uIFJhdGUgYnkgTm9ybWluZwoKYGBge3J9CnByb2RfZmluYWwgJT4lIAogIGdyb3VwX2J5KGxleGVtZSxpbmRpX21lYW4pICU+JQogIHN1bW1hcml6ZShtZWFuX3Byb3AgPSBtZWFuKHJlc3BvbnNlX25ldXRyYWwpKSAlPiUKICBnZ3Bsb3QoYWVzKHg9aW5kaV9tZWFuLHk9bWVhbl9wcm9wLGxhYmVsPWxleGVtZSkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fdGV4dCgpICsKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikKYGBgCgoKKipSZXNwb25zZXMgYnkgUG9saXRpY2FsIElkZW9sb2d5KioKCmBgYHtyfQpwcm9kX2RhdGEgJT4lIAogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIGZpbHRlcihtb3JwaF90eXBlID09ImNvbXBvdW5kIikgJT4lCiAgZ2dwbG90KGFlcyh4PXBvbGlfcGFydHksIGZpbGw9cmVzcG9uc2VfZ2VuZGVyKSkgKyAKICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIpICsgCiAgZmFjZXRfd3JhcCh+Z2VuZGVyKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGJyYW5fcGFsZXR0ZSkgKyAKICBsYWJzKHg9IlBhcnRpY2lwYW50IFBvbGl0aWNhbCBQYXJ0eSIsIGZpbGw9IkdlbmRlciBvZiBSZXNwb25zZSIsIHk9IlByb3BvcnRpb24gb2YgUmVzcG9uc2VzIiwgdGl0bGU9IkdlbmRlciBvZiBSZXNwb25zZSBieSBHZW5kZXIgb2YgU3RpbXVsdXMgTmFtZSIpICsgCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNSkpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MjUpKQpgYGAKCmBgYHtyfQpnZ3NhdmUoInByb2RfYWxsX3BvbGkucG5nIiwgd2lkdGg9NyxoZWlnaHQ9NSxwYXRoPScvVXNlcnMvYnJhbnBhcC9EZXNrdG9wL2dlbmRlcl9wcm9jZXNzaW5nL3RhbGtzX2FuZF9wYXBlcnMvcXBfcGFwZXIvZmlndXJlcycpCmBgYCAKCgoKCmBgYHtyfQpwcm9kX2RhdGEgJT4lIAogIGZpbHRlcighaXMubmEoc3ViamVjdF9pbmZvcm1hdGlvbi5wYXJ0eV9hbGlnbm1lbnQpKSAlPiUKICBmaWx0ZXIobW9ycGhfdHlwZSA9PSJjb21wb3VuZCIpICU+JQogIGdncGxvdChhZXMoeD1zdWJqZWN0X2luZm9ybWF0aW9uLnBhcnR5X2FsaWdubWVudCwgZmlsbD1yZXNwb25zZV9nZW5kZXIpKSArIAogIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIikgKyAKICBmYWNldF93cmFwKH5nZW5kZXIpICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYnJhbl9wYWxldHRlKSArIAogIGxhYnMoeD0iUGFydGljaXBhbnQgUG9saXRpY2FsIFBhcnR5IiwgZmlsbD0iR2VuZGVyIG9mIFJlc3BvbnNlIiwgeT0iUHJvcG9ydGlvbiBvZiBSZXNwb25zZXMiLCB0aXRsZT0iR2VuZGVyIG9mIFJlc3BvbnNlIGJ5IEdlbmRlciBvZiBTdGltdWx1cyBOYW1lIikKYGBgCgoqKkdlbmRlciBvZiBSZXNwb25zZSBieSBQb2xpdGljYWwgQWxpZ25tZW50IGFuZCBHZW5kZXIgSWRlb2xvZ3kqKgoKYGBge3J9CnByb2RfZGF0YSAlPiUKICBmaWx0ZXIoIWlzLm5hKHBvbGlfcGFydHkpKSAlPiUKICBtdXRhdGUocmVzcG9uc2VfbmV1dHJhbCA9IGlmZWxzZShyZXNwb25zZV9nZW5kZXIgPT0gIm5ldXRyYWwiLDEsMCkpICU+JQogIGZpbHRlcihnZW5kZXIhPSJmaWxsZXIiICYgZ2VuZGVyIT0gImF0dGVudGlvbiIgJiBnZW5kZXIhPSIiICYgbW9ycGhfdHlwZT09ImNvbXBvdW5kIikgJT4lCiAgZ3JvdXBfYnkoZ2VuZGVyLGdlbmRlcl90b3RhbCxwb2xpX3BhcnR5KSAlPiUKICBzdW1tYXJpc2UocHJvcG9ydGlvbiA9IG1lYW4ocmVzcG9uc2VfbmV1dHJhbCkpICU+JQogIGdncGxvdChhZXMoeD1nZW5kZXJfdG90YWwsIHk9cHJvcG9ydGlvbiwgY29sb3I9Z2VuZGVyKSkgKwogICAgZ2VvbV9wb2ludCgpICsgCiAgICBnZW9tX3Ntb290aCgpICsgCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYnJhbl9wYWxldHRlKSArCiAgICBmYWNldF93cmFwKH5wb2xpX3BhcnR5KSArIAogICAgbGFicyh4PSJHZW5kZXIgSWRlb2xvZ3kgU2NvcmUiLCB5PSJQcm9wb3J0aW9uIG9mIEdlbmRlciBOZXV0cmFsIFJlc3BvbnNlcyIsY29sb3I9IkdlbmRlciBvZiBOYW1lIFNlZW4iKSArIAogICAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNSkpCmBgYAoKYGBge3J9Cmdnc2F2ZSgicHJvZF9uZXV0cmFsX3BvbGkucG5nIiwgd2lkdGg9MTAsaGVpZ2h0PTUscGF0aD0nL1VzZXJzL2JyYW5wYXAvRGVza3RvcC9nZW5kZXJfcHJvY2Vzc2luZy90YWxrc19hbmRfcGFwZXJzL3FwX3BhcGVyL2ZpZ3VyZXMnKQpgYGAgCgpgYGB7cn0KcHJvZF9kYXRhICU+JQogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIG11dGF0ZShyZXNwb25zZV9uZXV0cmFsID0gaWZlbHNlKHJlc3BvbnNlX2dlbmRlciA9PSAibmV1dHJhbCIsMSwwKSkgJT4lCiAgZmlsdGVyKGdlbmRlciE9ImZpbGxlciIgJiBnZW5kZXIhPSAiYXR0ZW50aW9uIiAmIGdlbmRlciE9IiIpICU+JQogIGdyb3VwX2J5KGdlbmRlcixzdWJqZWN0X2luZm9ybWF0aW9uLmFnZSxwb2xpX3BhcnR5KSAlPiUKICBzdW1tYXJpc2UocHJvcG9ydGlvbiA9IG1lYW4ocmVzcG9uc2VfbmV1dHJhbCkpICU+JQogIGdncGxvdChhZXMoeD1zdWJqZWN0X2luZm9ybWF0aW9uLmFnZSwgeT1wcm9wb3J0aW9uLCBjb2xvcj1nZW5kZXIpKSArCiAgICBnZW9tX3BvaW50KCkgKyAKICAgIGdlb21fc21vb3RoKCkgKyAKICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBicmFuX3BhbGV0dGUpIApgYGAKCmBgYHtyfQpwcm9kX2RhdGEgJT4lCiAgZmlsdGVyKCFpcy5uYShwb2xpX3BhcnR5KSkgJT4lCiAgbXV0YXRlKHJlc3BvbnNlX25ldXRyYWwgPSBpZmVsc2UocmVzcG9uc2VfZ2VuZGVyID09ICJuZXV0cmFsIiwxLDApKSAlPiUKICBmaWx0ZXIoZ2VuZGVyIT0iZmlsbGVyIiAmIGdlbmRlciE9ICJhdHRlbnRpb24iICYgZ2VuZGVyIT0iIikgJT4lCiAgZ3JvdXBfYnkoZ2VuZGVyLHdvcmtlcmlkLHBvbGlfcGFydHkpICU+JQogIHN1bW1hcmlzZShwcm9wb3J0aW9uID0gbWVhbihyZXNwb25zZV9uZXV0cmFsKSkgJT4lCiAgZ2dwbG90KGFlcyh4PXBvbGlfcGFydHksIHk9cHJvcG9ydGlvbiwgZmlsbD1wb2xpX3BhcnR5KSkgKwogICAgZ2VvbV9ib3hwbG90KHZhcndpZHRoID0gVCkgKyAKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1icmFuX3BhbGV0dGUpICsgCiAgICBmYWNldF93cmFwKH5nZW5kZXIpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIAogIGxhYnMoeD0iUGFydGljaXBhbnQgUG9saXRpY2FsIFBhcnR5IiwgeT0iUHJvcG9ydGlvbiIsdGl0bGU9Ik1lYW4gUHJvcC4gb2YgTmV1dHJhbCBSZXNwb25zZXMgYnkgU3RpbXVsaSBHZW5kZXIiKSArIAogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTYpKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTIwKSkKYGBgCgpgYGB7cn0KZ2dzYXZlKCJwcm9kX25ldXRyYWxfcG9saV9ib3gucG5nIiwgd2lkdGg9NywgaGVpZ2h0PTUscGF0aD0nL1VzZXJzL2JyYW5wYXAvRGVza3RvcC9nZW5kZXJfcHJvY2Vzc2luZy90YWxrc19hbmRfcGFwZXJzL3FwX3BhcGVyL2ZpZ3VyZXMnKQpgYGAgCgoqKkdlbmRlciBieSBHZW5kZXIsIG5vIElkZW9sb2d5KioKCmBgYHtyfQpwcm9kX2RhdGEgJT4lCiAgZmlsdGVyKG1vcnBoX3R5cGUgPT0iY29tcG91bmQiKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2VuZGVyLCBmaWxsPXJlc3BvbnNlX2dlbmRlcikpICsgCiAgZ2VvbV9iYXIocG9zaXRpb249ImZpbGwiKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGJyYW5fcGFsZXR0ZSkgKyAKICBsYWJzKHg9IlN0aW11bHVzIEdlbmRlciIsIGZpbGw9IkdlbmRlciBvZiBSZXNwb25zZSIsIHk9IlByb3BvcnRpb24gb2YgUmVzcG9uc2VzIiwgdGl0bGU9IkdlbmRlciBvZiBSZXNwb25zZSBieSBHZW5kZXIgb2YgU3RpbXVsdXMgTmFtZSIpICsKICB0aGVtZV9taW5pbWFsKCkgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPSkpCmBgYAoKKipNb2RlbHMqKgoKYGBge3J9CnByb2RfZGF0YV9jb21wb3VuZHMgPC0gcHJvZF9kYXRhICU+JQogIGZpbHRlcihtb3JwaF90eXBlID09ICJjb21wb3VuZCIpICU+JQogIG11dGF0ZShjZ2VuZGVyX3RvdGFsID0gc2NhbGUoZ2VuZGVyX3RvdGFsKSkgJT4lCiAgbXV0YXRlKHJlc3BvbnNlX2NvbmdydWVuY3kgPSBhcy5udW1lcmljKGlmZWxzZShjb25ncnVlbmN5PT0idHJ1ZSIsIjEiLCIwIikpKSAlPiUKICBtdXRhdGUoY2FnZSA9IHNjYWxlKHN1YmplY3RfaW5mb3JtYXRpb24uYWdlKSkgJT4lCiAgbXV0YXRlKG5ldXRyYWxpdHlfYmluYXJ5ID0gaWZlbHNlKG5ldXRyYWxpdHk9PSJ0cnVlIiwxLDApKQpgYGAKCmBgYHtyfQpmaW5hbF9kYXQgPC0gbWVyZ2UocHJvZF9kYXRhX2NvbXBvdW5kcyxsZXhfZnJlcXMsYnk9ImxleGVtZSIpICU+JQogIG11dGF0ZShuZXV0cmFsaXR5X2JpbmFyeSA9IGlmZWxzZShuZXV0cmFsaXR5PT0idHJ1ZSIsMSwwKSkgJT4lCiAgZmlsdGVyKG1vcnBoX3R5cGUgPT0gImNvbXBvdW5kIikgJT4lCiAgbXV0YXRlKGNnZW5kZXJfdG90YWwgPSBzY2FsZShnZW5kZXJfdG90YWwpKSAlPiUKICBtdXRhdGUocmVzcG9uc2VfY29uZ3J1ZW5jeSA9IGFzLm51bWVyaWMoaWZlbHNlKGNvbmdydWVuY3k9PSJ0cnVlIiwiMSIsIjAiKSkpICU+JQogIG11dGF0ZShjYWdlID0gc2NhbGUoc3ViamVjdF9pbmZvcm1hdGlvbi5hZ2UpKSAlPiUKICBtdXRhdGUoY21lYW5fbGVmdF9uZXV0cmFsID0gc2NhbGUobWVhbl9sZWZ0X25ldXRyYWwpKSAlPiUKICBtdXRhdGUobWVhbl9hbGwgPSAobWVhbl9sZWZ0X25ldXRyYWwgKyBtZWFuX3JpZ2h0X25ldXRyYWwpLzIpICU+JQogIG11dGF0ZShjbWVhbl9hbGwgPSBzY2FsZShtZWFuX2FsbCkpCmBgYAoKYGBge3J9CnByb2R1Y3Rpb25fbW9kZWxfb25lIDwtIGxtZXIobmV1dHJhbGl0eV9iaW5hcnl+Y2dlbmRlcl90b3RhbCArIHBvbGlfcGFydHkgKyBnZW5kZXIgKyBjbWVhbl9hbGwgKyAoMXx3b3JrZXJpZCkgKyAoMXxsZXhlbWUpICsgKDF8bmFtZSksZGF0YT1maW5hbF9kYXQpCmBgYAoKYGBge3J9CnN1bW1hcnkocHJvZHVjdGlvbl9tb2RlbF9vbmUpCmBgYAoKCiMgU29tZSBQcm9wIFRhYmxlcwoKYGBge3J9Cih0YWJsZShwcm9kX2RhdGEkc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXIpKQpgYGAKCgoKYGBge3J9CnByb2RfZ2VuZGVyX3RhYmxlIDwtIHByb2RfZGF0YSAlPiUKICBncm91cF9ieSh3b3JrZXJpZCxzdWJqZWN0X2luZm9ybWF0aW9uLmdlbmRlcixwb2xpX3BhcnR5KSAlPiUKICBzdW1tYXJpc2Uoc3ViamVjdF9nZW5kZXIgPSBwYXN0ZSh1bmlxdWUoc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXIpKSkKCnRhYmxlKHByb2RfZ2VuZGVyX3RhYmxlJHN1YmplY3RfZ2VuZGVyLHByb2RfZ2VuZGVyX3RhYmxlJHBvbGlfcGFydHkpCmBgYAoKYGBge3J9CnByb2RfZGF0YV9hbGwgPC0gcmVhZC5jc3YoInByb2R1Y3Rpb25fZGF0YS5jc3YiKSAlPiUKICBmaWx0ZXIodHlwZT09ImZpbGxlcl9zZW1hbnRpYyIgfCB0eXBlPT0iZmlsbGVyX2dyYW1tYXRpY2FsIikgJT4lCiAgZ3JvdXBfYnkobGV4ZW1lLHR5cGUpICU+JQogIHN1bW1hcmlzZShsZXhlbWU9cGFzdGUodW5pcXVlKGxleGVtZSkpKQpgYGAKCmBgYHtyfQp0YWJsZShwcm9kX2RhdGFfYWxsJHR5cGUpCmBgYAoKYGBge3J9CnBhcnRpY2lwYW50X2FnZXMgPC0gZmluYWxfc3ByICU+JQogIHNlbGVjdCh3b3JrZXJpZCxwb2xpX3BhcnR5LHN1YmplY3RfaW5mb3JtYXRpb24uYWdlKSAlPiUKICB1bmlxdWUoKQpgYGAKCmBgYHtyfQpwYXJ0aWNpcGFudF9hZ2VzICU+JQogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIGdncGxvdChhZXMoeD1zdWJqZWN0X2luZm9ybWF0aW9uLmFnZSwgZmlsbD1wb2xpX3BhcnR5KSkgKyAKICBnZW9tX2RlbnNpdHkoYWxwaGE9LjMsIHBvc2l0aW9uPSJpZGVudGl0eSIpCmBgYAoKYGBge3J9CnBhcnRpY2lwYW50X2FnZXMgJT4lCiAgZ3JvdXBfYnkocG9saV9wYXJ0eSkgJT4lCiAgc3VtbWFyaXNlKG1lYW49bWVhbihzdWJqZWN0X2luZm9ybWF0aW9uLmFnZSwgbmEucm0gPSBUUlVFKSkKYGBgCgpgYGB7cn0KZmluYWxfc3ByIDwtIGZpbmFsX3NwciAKYGBgCgpgYGB7cn0KZmluYWxfc3ByICU+JQogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIGZpbHRlcighaXMubmEoeW91bmdfb2xkKSkgJT4lCiAgZmlsdGVyKHBvbGlfcGFydHkgIT0gIk5vbi1QYXJ0aXNhbiIpICU+JQogIGdyb3VwX2J5KGZvcm0scG9saV9wYXJ0eSx5b3VuZ19vbGQpICU+JQogIG11dGF0ZShyZXNpZF9ydF9tZWFuID0gbWVhbihyZXNpZF9ydCkpICU+JQogIGZpbHRlcihsb2dfYWxsID4gLTUpICU+JQogIGdncGxvdChhZXMoeD1sb2dfYWxsLHk9cmVzaWRfcnRfbWVhbixsYWJlbD1mb3JtKSkgKwogIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iKSArIAogIGdlb21fdGV4dChzaXplPTQsbnVkZ2VfeSA9LjAzKSArIAogIGZhY2V0X2dyaWQoeW91bmdfb2xkfnBvbGlfcGFydHkpCmBgYAoKCgpgYGB7cn0KZmluYWxfc3ByICU+JQogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIGZpbHRlcighaXMubmEoeW91bmdfb2xkKSkgJT4lCiAgZmlsdGVyKG1lZGlhX3NvdXJjZSA+IC01KSAlPiUKICBncm91cF9ieShmb3JtLHBvbGlfcGFydHkseW91bmdfb2xkKSAlPiUKICBtdXRhdGUocmVzaWRfcnRfbWVhbiA9IG1lYW4ocmVzaWRfcnQpKSAlPiUKICBmaWx0ZXIobG9nX2FsbCA+IC01KSAlPiUKICBnZ3Bsb3QoYWVzKHg9bWVkaWFfc291cmNlLHk9cmVzaWRfcnRfbWVhbixsYWJlbD1mb3JtKSkgKwogIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iKSArIAogIGdlb21fdGV4dChzaXplPTQsbnVkZ2VfeSA9LjAzKSArIAogIGZhY2V0X2dyaWQoeW91bmdfb2xkfnBvbGlfcGFydHkpCmBgYAoKYGBge3J9CmZpbmFsX3NwciAlPiUKICBzZWxlY3QocG9saV9wYXJ0eSxsb2dfbGVmdCxsb2dfcmlnaHQsbG9nX2FsbCxtZWRpYV9zb3VyY2UpCmBgYAoKYGBge3J9CnRlbXAgPC0gZmluYWxfc3ByICU+JQogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIGZpbHRlcighaXMubmEoeW91bmdfb2xkKSkgJT4lCiAgZmlsdGVyKG1lZGlhX3NvdXJjZSA+IC01KSAlPiUKICBncm91cF9ieShmb3JtLHBvbGlfcGFydHkseW91bmdfb2xkKSAlPiUKICBtdXRhdGUocmVzaWRfcnRfbWVhbiA9IG1lYW4ocmVzaWRfcnQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZmlsdGVyKGxvZ19hbGwgPiAtNSkKYGBgCgpgYGB7cn0KY29yc193aW5kb3cgPSB0ZW1wICU+JSAKICBncm91cF9ieShwb2xpX3BhcnR5LHlvdW5nX29sZCkgJT4lIAogIHN1bW1hcml6ZShDb3JyZWxhdGlvbj1yb3VuZChjb3IudGVzdChtZWRpYV9zb3VyY2UscmVzaWRfcnRfbWVhbikkZXN0aW1hdGUsMiksUD1yb3VuZChjb3IudGVzdChtZWRpYV9zb3VyY2UscmVzaWRfcnRfbWVhbikkcC52YWx1ZSw1KSkKY29yc193aW5kb3cKYGBgCgpgYGB7cn0KY29yc19sb2dfYWxsID0gdGVtcCAlPiUgCiAgZ3JvdXBfYnkocG9saV9wYXJ0eSx5b3VuZ19vbGQpICU+JSAKICBzdW1tYXJpemUoQ29ycmVsYXRpb249cm91bmQoY29yLnRlc3QobG9nX2FsbCxyZXNpZF9ydF9tZWFuKSRlc3RpbWF0ZSwyKSxQPXJvdW5kKGNvci50ZXN0KGxvZ19hbGwscmVzaWRfcnRfbWVhbikkcC52YWx1ZSw1KSkKY29yc19sb2dfYWxsCmBgYAoKYGBge3J9CnRlbXAgJT4lCiAgY29yKG1lZGlhX3NvdXJjZSwgcmVzaWRfcnRfbWVhbikKYGBgCgpgYGB7cn0KY29yKHRlbXAkbWVkaWFfc291cmNlLHRlbXAkcmVzaWRfcnRfbWVhbikKYGBgCgpgYGB7cn0KZmluYWxfc3ByICU+JQogIHNlbGVjdCh3b3JrZXJpZCxwb2xpX3BhcnR5LHN1YmplY3RfaW5mb3JtYXRpb24uYWdlKSAlPiUKICB1bmlxdWUoKSAlPiUKICBzdW1tYXJpc2VfYWxsKGZ1bnMoc3VtKGlzLm5hKC4pKSkpCmBgYApgYGB7cn0KZmluYWxfc3ByICU+JQogIHNlbGVjdCh3b3JrZXJpZCxwb2xpX3BhcnR5LHN1YmplY3RfaW5mb3JtYXRpb24uYWdlKSAlPiUKICB1bmlxdWUoKSAlPiUKICBjb3VudChwb2xpX3BhcnR5KSAKYGBgCgpgYGB7cn0KZmluYWxfc3ByICU+JQogIHNlbGVjdCh3b3JrZXJpZCxwb2xpX3BhcnR5LHN1YmplY3RfaW5mb3JtYXRpb24uYWdlKSAlPiUKICB1bmlxdWUoKSAlPiUKICBjb3VudChzdWJqZWN0X2luZm9ybWF0aW9uLmFnZSkgCmBgYAoKCmBgYHtyfQp0YWJsZShkZW1fdGVtcCRwb2xpX3BhcnR5LGRlbV90ZW1wJHN1YmplY3RfaW5mb3JtYXRpb24uYWdlLCBuYS5ybT1UUlVFKQpgYGAKCmBgYHtyfQp0YWJsZShmaW5hbF9zcHIkeW91bmdfb2xkLGZpbmFsX3NwciRwb2xpX3BhcnR5KQpgYGAKCgpgYGB7cn0KZmluYWxfc3ByICU+JQogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIGZpbHRlcighaXMubmEoc3ViamVjdF9pbmZvcm1hdGlvbi5hZ2UpKSAlPiUKICBmaWx0ZXIodHJpYWxfY29uZ3J1ZW5jeSA9PSAibmV1dHJhbCIpICU+JQogIGZpbHRlcihsZXhlbWUgIT0gImZsaWdodCBhdHRlbmRhbnQiKSAlPiUKICBncm91cF9ieShsZXhlbWUsdHJpYWxfZ2VuZGVyLHBvbGlfcGFydHkseW91bmdfb2xkKSAlPiUKICBtdXRhdGUobGV4X21lYW4gPSBtZWFuKHJlc2lkX3J0KSkgJT4lCiAgZ2dwbG90KGFlcyh4PWxleGVtZV9ub3JtLHk9bGV4X21lYW4sIGNvbG9yPXRyaWFsX2dlbmRlcixsYWJlbD1sZXhlbWUpKSArIAogIGdlb21fcG9pbnQoKSArIAogIGdlb21fdGV4dCgpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsgCiAgZmFjZXRfZ3JpZCh5b3VuZ19vbGR+cG9saV9wYXJ0eSkKYGBgCgpgYGB7cn0KZmluYWxfc3ByICU+JQogIGZpbHRlcih0cmlhbF9jb25ncnVlbmN5ID09ICJuZXV0cmFsIikgJT4lCiAgZmlsdGVyKGxleGVtZSAhPSAiZmxpZ2h0IGF0dGVuZGFudCIpICU+JQogIGdncGxvdChhZXMoeD1sZXhlbWVfbm9ybSwgeT1sb2dfYWxsKSkgKyAKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikKYGBgCmBgYHtyfQpmaW5hbF9zcHIgJT4lCiAgZmlsdGVyKCFpcy5uYShwb2xpX3BhcnR5KSkgJT4lCiAgZmlsdGVyKHRyaWFsX2NvbmdydWVuY3kgPT0gIm5ldXRyYWwiKSAlPiUKICBmaWx0ZXIobGV4ZW1lICE9ICJmbGlnaHQgYXR0ZW5kYW50IikgJT4lCiAgbXV0YXRlKGZyZXFfaGlnaF9sb3cgPSBjdXRfaW50ZXJ2YWwobG9nX2FsbCxuPTIsbGFiZWxzPWMoImxvdyIsImhpZ2giKSkpICU+JQogIGdncGxvdChhZXMoeD1sZXhlbWVfbm9ybSwgeT1sb2dfYWxsKSkgKyAKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgKyAKICBmYWNldF9ncmlkKGZyZXFfaGlnaF9sb3d+cG9saV9wYXJ0eSkKYGBgCmBgYHtyfQpmaW5hbF9zcHIgJT4lCiAgZmlsdGVyKCFpcy5uYShwb2xpX3BhcnR5KSkgJT4lCiAgZmlsdGVyKHRyaWFsX2NvbmdydWVuY3kgPT0gIm5ldXRyYWwiKSAlPiUKICBmaWx0ZXIobGV4ZW1lICE9ICJmbGlnaHQgYXR0ZW5kYW50IikgJT4lCiAgbXV0YXRlKGZyZXFfaGlnaF9sb3cgPSBjdXRfaW50ZXJ2YWwobG9nX2FsbCxuPTIsbGFiZWxzPWMoImxvdyIsImhpZ2giKSkpICU+JQogIGdyb3VwX2J5KGxleGVtZSx0cmlhbF9nZW5kZXIscG9saV9wYXJ0eSxmcmVxX2hpZ2hfbG93LGxleGVtZV9ub3JtKSAlPiUKICBzdW1tYXJpc2UobGV4X21lYW4gPSBtZWFuKHJlc2lkX3J0KSkgJT4lCiAgZ2dwbG90KGFlcyh4PWxleGVtZV9ub3JtLCB5PWxleF9tZWFuLGNvbG9yPXRyaWFsX2dlbmRlcikpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsgCiAgZmFjZXRfZ3JpZChmcmVxX2hpZ2hfbG93fnBvbGlfcGFydHkpCmBgYAoKCgoKCgoKYGBge3J9CnRlbXBfdHdvIDwtIGZpbmFsX3NwciAlPiUKICBmaWx0ZXIoIWlzLm5hKHBvbGlfcGFydHkpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHN1YmplY3RfaW5mb3JtYXRpb24uYWdlKSkgJT4lCiAgIyBmaWx0ZXIodHJpYWxfY29uZ3J1ZW5jeSA9PSAibmV1dHJhbCIpICU+JSAKICBmaWx0ZXIobGV4ZW1lICE9ICJmbGlnaHQgYXR0ZW5kYW50IikgJT4lIAogIGdyb3VwX2J5KHRyaWFsX2NvbmdydWVuY3kpICU+JSAKICBzdW1tYXJpemUoQ29ycmVsYXRpb249cm91bmQoY29yLnRlc3QobG9nX2FsbCxsZXhlbWVfbm9ybSkkZXN0aW1hdGUsMiksUD1yb3VuZChjb3IudGVzdChsb2dfYWxsLGxleGVtZV9ub3JtKSRwLnZhbHVlLDUpKQp0ZW1wX3R3bwpgYGAKCmBgYHtyfQpjb3JzX3BvbGlfbm9ybSA9IHRlbXBfdHdvICU+JSAKICBncm91cF9ieShwb2xpX3BhcnR5LGxleGVtZV9ub3JtKSAlPiUgCiAgc3VtbWFyaXplKENvcnJlbGF0aW9uPXJvdW5kKGNvci50ZXN0KGxleGVtZV9ub3JtLHJlc2lkX3J0X21lYW4pJGVzdGltYXRlLDIpLFA9cm91bmQoY29yLnRlc3QobGV4ZW1lX25vcm0scmVzaWRfcnRfbWVhbikkcC52YWx1ZSw1KSkKY29yc19sb2dfYWxsCmBgYAoKCgoKYGBge3J9CmZpbmFsX3NwciAlPiUKICBncm91cF9ieSh0cmlhbF9nZW5kZXIsdHJpYWxfY29uZ3J1ZW5jeSxtb3JwaF90eXBlKSAlPiUKICBzdW1tYXJpemUoTWVhblJUID0gbWVhbihyZXNpZF9ydCksIENJLkxvdyA9IGNpLmxvdyhyZXNpZF9ydCksIENJLkhpZ2ggPSBjaS5oaWdoKHJlc2lkX3J0KSkgJT4lCiAgbXV0YXRlKFlNaW4gPSBNZWFuUlQgLSBDSS5Mb3csIFlNYXggPSBNZWFuUlQgKyBDSS5IaWdoKSAlPiUKICBnZ3Bsb3QoYWVzKHg9bW9ycGhfdHlwZSx5PU1lYW5SVCxjb2xvcj10cmlhbF9nZW5kZXIpKSArIAogIGdlb21fcG9pbnQoKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49WU1pbix5bWF4PVlNYXgpLCB3aWR0aD0uMjUpICsgCiAgZmFjZXRfd3JhcCh+dHJpYWxfY29uZ3J1ZW5jeSkKYGBgCgo=